Из руководства tee
по моей системе:
Утилита tee копирует стандартный ввод в стандартный вывод, создавая копию в ноль или более файлов. Вывод не буферизован.
Итак, он читает из стандартного ввода и копирует его в стандартный вывод, и при этом также дублирует поток в один или несколько файлов.
В следующем конвейере tee
будет брать вывод первой команды в конвейере и копировать его в стандартный вывод (терминал), а также копировать его в файлы one
, two
и three
:
$ somecommand | tee one two three
tee
имеет много применений, одно в сочетании с sudo
для перенаправления вывода в файл, принадлежащий root:
$ somecommand | sudo tee /root/somefile >/dev/null
Следующее не сработало бы, поскольку перенаправление происходит от имени непривилегированного пользователя (также будет выполняться какая-то команда
от имени root, что может быть нежелательно):
$ sudo somecommand >/root/somefile
Искусственный пример добавления фиксированного набора строк ко многим файлам одновременно (ко всем файлам пользователей ~/.profile
, при условии, что *
расширяется до имен пользователей и что расширенная командная строка делает не станет слишком длинным для обработки оболочки):
$ tee -a /home/*/.profile <<'END_NEWPATH'
PATH="$PATH:/opt/bin"
END_NEWPATH
Реальный пример использования tee
:
time doas box-build.sh 2>&1 | tee build.out | grep '^=*>'
Это моя сборка базовой системы OpenBSD. doas
— это «эквивалент» OpenBSD sudo
и box-build.sh
— небольшой сценарий оболочки, который выполняет сборку (по сути, cd /usr/src && make obj && make build
).Я хотел бы сохранить вывод всего процесса сборки, включая любые ошибки или предупреждения, но я не хочу, чтобы все выплескивалось в мой терминал. С этой целью я использую tee
, чтобы сохранить все в build.out
, а затем grep
, чтобы получить только подсказку о том, на каком этапе процесса мы находимся в терминале.
См. также другие вопросы, отмеченные тегом tee.