Как использовать команду Tee в Linux

Футболка Рекомендуемая

Если вы когда-либо использовали каналы и перенаправления в своей оболочке Linux, скорее всего, вам также иногда понадобится использовать утилиту tee.

Что делает тройник?

Такая команда, как

отобразит содержимое вашего текущего каталога. Другими словами, он отображает это содержимое в stdout (стандартный вывод), который обычно является вашим экраном или, точнее, дисплеем вашего виртуального терминала.

Команда вроде

ничего не будет отображать на вашем экране. Это связано с тем, что знак > перенаправляет весь вывод в файл, а не отображает его в стандартный вывод. file123 теперь будет заполнен содержимым, которое ранее отображалось на вашем экране.

Чтобы отобразить содержимое вашего каталога на экране и записать его в файл, вы используете две команды. С tee вы можете делать обе эти вещи одновременно.

Зачем использовать тройник, если вы можете выполнить аналогичную команду дважды?

В приведенном выше примере вам, очевидно, не понадобится tee, если вы можете выполнить ls в обычном режиме, а затем выполнить его снова и перенаправить вывод в файл. Однако вы можете столкнуться с ситуациями, когда результат будет уникальным. Представьте себе сценарий, в котором вы пытаетесь диагностировать проблему. Вы запускаете диагностировать | tee error.log . Ошибки, которые вы получаете, могут быть уникальными. Вы хотите, чтобы они отображались на экране, чтобы вы могли видеть, что происходит при тестировании. Но вы также хотите, чтобы эти ошибки сохранялись в файле, чтобы вы могли просмотреть их позже или вставить вывод в дискуссионный форум и спросить об этом людей.

Другая часто встречающаяся ситуация, когда вам может понадобиться tee, заключается в следующем: вы хотите записать вывод команды в место, где только пользователь root может читать или писать. Это не сработает.

Тогда вы можете подумать: "Ну, конечно, просто используйте sudo!" И вы удивитесь, что это тоже не работает:

Это потому, что после выполнения sudo blkid вы по-прежнему вошли в систему как обычный пользователь без полномочий root. И ваша оболочка (обычно bash) пытается записать в / root / somefile с вашими учетными данными обычного пользователя. Чтобы решить эту проблему, вы можете использовать тройник:

Добавление текста и перенаправление ошибок

tee - полезная, но простая команда; базовая команда | tee somefile в большинстве случаев будет достаточно. Однако есть два сценария, которые могут потребовать этих советов.

Первое, что нужно знать, это то, что по умолчанию tee всегда перезаписывает файл. Если ты бежишь

а потом

вторая команда перезапишет содержимое somefile, и вы увидите только содержимое последней выполненной команды. Чтобы изменить это поведение, вы можете добавить текст вместо перезаписи. Для этого просто используйте командный переключатель -a.

Второе, что нужно знать, это то, что не все выходные данные одинаковы. Сообщения об ошибках обрабатываются по-разному, и, хотя они появляются на экране, они не считаются стандартным выводом, поэтому их не поймают. (Они считаются stderr.) Вот пример grep.

Будет отображено что-то вроде следующего изображения.

Тройник Grep Выход

Сообщения об отказе в доступе записываются в stderr. Единственное, что записывается в стандартный вывод, - это выделенный текст. Вот почему вы заметите, что содержимое somefile - это то, что показано на изображении ниже.

Tee Grep Содержимое файла

В этом случае, когда для поиска текста используется grep, полезно, чтобы сообщения об ошибках не перенаправлялись в файл. Они просто засыпали файл ненужным мусором. Вы хотите видеть только найденные результаты. Но когда вам нужны сообщения об ошибках, используйте 2> & 1, который перенаправляет stderr на stdout.

С помощью этой команды вы заметите, что somefile теперь также содержит сообщения об ошибках.

Заключение

Надеюсь, это руководство охватывает все, что вам нужно, чтобы максимально эффективно использовать команду tee. Но если вы столкнетесь с ситуацией, когда вы застряли с тройником, оставьте комментарий ниже, и мы сможем помочь.