Все случаи, которые tee
я когда-либо видел, были такими:
do_something | tee -a logfile
Или же:
do_something_else | tee logfile
Является ли tee
придумано для тех, кто не знает , вы можете сделать то же самое с оболочкой трубой перенаправлениями? Такие как:
do_something >> logfile
Или же:
do_something_else > logfile
Это практически то же самое, и для набора текста требуется меньше нажатий клавиш. В каких скрытых функциях я не вижу tee
?
tee
и I / O перенаправлением ? Дело в том , что он говорит , «оболочка трубы переназначения , такие как>
и>>
» не является точкой в его пользу, и является аргументом в пользу закрытия неясной. Но на самом деле он задает несколько вопросов: «Какова цельtee
?», «tee
Придумано для тех, кто не знает, что вы можете сделать то же самое с перенаправлениями оболочки?» И «В каких скрытых функциях я не вижуtee
?». По крайней мере, два из этих вопросов слишком широки.Ответы:
То , что вы не видите, что
do_something | tee -a logfile
ставит вывод вlogfile
и на стандартный вывод, аdo_something >> logfile
ставит его только в лог - файл.Цель
tee
состоит в том, чтобы создать сценарий с одним входом и несколькими выходами, как в пересечении «Т».РЕДАКТИРОВАТЬ
Там были комментарии о том, как
tee
позволяет более простое использованиеsudo
. Это рядом с точкой:cat
,dd
или , может быть , лучшеbuffer
предоставить эту возможность с более высокой производительностью, если вы не нужны несколько выходов. Используйтеtee
для того, для чего он предназначен, а не для того, что он «может сделать»источник
tee
может даже принимать несколько аргументов и записывать сразу в несколько файлов.cat
прямой способ вместо,tee
например, вecho /var/work/core.%p | sudo tee /proc/sys/kernel/core_pattern
?echo /var/work/core.%p | sudo cat > /proc/sys/kernel/core_pattern
не работает, потому что перенаправление обрабатывается не-sudo оболочкой. Что касаетсяdd
,echo /var/work/core.%p | sudo dd of=/proc/sys/kernel/core_pattern
работает, ноdd
часто это мощный инструмент, способный нанести большой урон, особенно подsudo
. Что касаетсяbuffer
, он не установлен по умолчанию ни в одном из дистрибутивов на основе RedHat или Ubuntu, которые я должен передать (или MacOS) ...cat
ни/bin/cat
работа для меня в этой ситуации. Неважно, откуда онcat
берется - он>
будет по-прежнему обрабатываться оболочкой верхнего уровня (не sudo). Преимуществоtee
overcat
в этой ситуации заключается в том, что он позволяет передавать выходной файл в качестве параметра командной строки (а не перенаправления).dd
это, безусловно, жизнеспособный вариант, хотя я бы все же поддержалtee
этоcat
иtee
как встроена? А какая версияsudo
может запускать встроенные оболочки?Tee
не бесполезенМожет быть, вы знали это в любом случае? Если нет, то читайте дальше! Или, если вы знаете, как он работает, но не знаете, почему он существует, перейдите к концу, чтобы увидеть, как он вписывается в философию Unix.
Что это цель
tee
?В простейшем случае он берет данные на стандартный ввод и записывает их в стандартный вывод и один (или более) файл. Его сравнивают с сантехническим тройником так, как он разделяет один вход на два выхода (и два направления).
Примеры
Давайте возьмем ваш первый пример:
Он принимает вывод
do_something
и добавляет его в файл журнала, а также отображает его для пользователя. На самом деле, страницаtee
в Википедии содержит второй пример:В следующем примере есть другое применение: повышение разрешений :
Или, может быть, вы хотите взять выходные данные одной команды, записать их где-нибудь, а также использовать их в качестве входных данных для другой команды?
(благодарю за примеры использования команды Tee )
Tee
работает с философией Unix:(Благодарность основам философии Unix )
tee
подходит всем этим:источник
sudo tee -a
это , вероятно, более недавнее нововведение (я впервые увидел его в руководствах Ubuntu / вики специально для установки вещи в/proc/sys
, потому что переход на Ubuntu, когда я перешел наsudo
систему , основанную (как Ubuntu настроенном по умолчанию) вместо использованияsu
с пароль root). Я думаю , чтоtee
раньшеsudo
, так что это не причина дляtee
существования. Вам не нужноtee
для этого, просто печатать в интерактивном режиме, чемsudo sh -c 'cat > output'
.tee
питать два конвейера, вроде быfoo | tee >(pipe2) | pipe1
. Или еще один интересный способ -ffmpeg ... |& tee /dev/tty | sed 's/.*\r// > encode.log
интерактивно видеть обновления строки состояния на tty, при этом удаляя «строки», заканчивающиеся символом возврата каретки, а не символом новой строки для фактической регистрации. (т.е. отфильтровывать обновления строки состояния). В общем, вы можете прикрепитьtee /dev/tty
любое место в конвейере как отладочную печать.>
и устанавливает перенаправление до того, как sudo даже получитexec
, поэтому определенно не является ограничением sudo, что она не обрабатывает вещи, которые никогда не видит. :) Обычно я пытаюсь обозначить это как «рабочий процесс sudo» или какой-то подобный термин, когда я объясняю это, а не описывать само sudo.sudo tee -a
Это ИМХО злоупотребление тройником. Использованиюsudo cat
,sudo dd
или (с лучшей производительностью во многих случаях) ,sudo buffer
если вам не нужно несколько выходов.Это совсем не то же самое ...
Следующее представляется несколько эквивалентным, но это не так:
Критическое различие заключается в том, что первый записал данные только в именованный файл, а последний записал
hi
в терминал (stdout
) и названный файл, как показано ниже:tee
позволяет вам записывать данные в файл и использовать их в последующем конвейере, что позволяет вам делать полезные вещи, такие как хранение данных из частично через конвейер:Или вы можете записать в файл с повышенными привилегиями, не предоставляя всему конвейеру повышенные привилегии (здесь
echo
запускается как пользователь, аtee
записывает в файл какroot
):С помощью
tee
вы можете записать много файлов ( иstdout
):Также можно использовать
exec
с,tee
чтобы записать весь вывод скрипта в файл, при этом позволяя наблюдателю (stdout
) видеть данные:источник
exec > >(tee "$LOGFILE") 2>&1
стоит забывать в скрипте bash, который позволяет скрипту выводить stdout и stderr как в stdout, так и в файл, на который указывает$LOGFILE
.2>&1
чтобы сбросить вывод и ошибки в текстовые файлы в Windows.Это тройник:
Т-образный фитинг. Он имеет вход и два отдельных выхода.
Другими словами, он разделяет одну трубу на две; как развилка на дороге.
Аналогично,
tee
это pipe (|
), который позволяет перенаправлять ваш стандартный ввод на два отдельных выхода.Пример
Скажем, например, вы печатаете
ls /
.Вы получите вывод, который выглядит примерно так:
Перенаправьте вывод в текстовый файл,
ls / > ls.txt
и вывод не отображается в оболочке, только в результирующем текстовом файле.Хотите увидеть вывод и одновременно передать его в текстовый файл?
Добавьте
tee
к своей трубе (|
) то есть:ls / | tee ls.txt
Сравните два:
источник
Нет. Вы упомянули один из немногих примеров, где вы действительно можете перенаправить на файл с помощью операторов
>
and>>
.Но Ти может сделать гораздо больше. Поскольку вы направляетесь к нему по трубопроводу, вы можете затем передавать по трубопроводу что-то еще.
Хороший пример приведен на странице википедии :
По сути, вы можете передавать по трубопроводу к Tee, а затем по трубопроводу от Tee к чему-то еще. Если все, что вы хотите сделать, это написать файл журнала, да, тогда вам не нужен Tee.
источник
tee
далеко не бесполезен. Я использую это все время и рад, что это существует. Это очень полезный инструмент, если у вас есть конвейер, который вы хотите разделить. Очень простой пример: у вас есть какой-то каталог,$d
который вы хотите скопировать, и вы также хотите его хэшировать, потому что вы параноик (как и я) и не доверяете носителю для надежного хранения данных. Вы можете сначала записать его на диск, а затем хэшировать, но это не получится, если архив будет поврежден до того, как будет хеширован. Кроме того, вам придется прочитать его, и если вы будете много работать с файлами размером в несколько сотен ГБ, вы поймете, что действительно не хотите читать их снова, если этого не требуется.Так что я делаю просто так:
Он создает тарный шарик и направляет его в тройник, который затем направляет его в две вложенные оболочки, в одной из которых он хэшируется, а в другой - записывается на диск.
Также замечательно, если вы хотите выполнить несколько операций с большим файлом:
Считывает файл один раз, хэширует его (чтобы вы могли проверить, все ли оно в порядке), извлекает его и копирует в другое место. Нет необходимости читать это три раза для этого.
источник
tee
не создает подоболочек; вызывающая оболочка запускаетсяsha5sum
иcat
соединяет свои выходные данные с файловыми дескрипторами, которые передаютсяtee
. Кроме того, бесполезное использованиеcat
; Вы можете использовать перенаправление ввода дляtee
чтения непосредственно изfile.tar.gz
.cat
это любовь.cat
это жизнь.< file.tar.gz tee >(sha256sum) ...
если вас беспокоит лексическое упорядочение перенаправлений. Это не меняет того факта, что нет необходимости в совершенно отдельном процессе, чтобы просто передать один файлtee
.cat
относительно низкая. Стоимость дополнительных 100 ГиБ системных вызовов write + read определенно тратит дополнительное процессорное время и пропускную способность памяти для предложенного вами примера огромного файла. Помните, что пропускная способность памяти является общим ресурсом для всех ядер, не говоря уже о дополнительном загрязнении кэша L3 в результате этого копирования. На x86 с включенным смягчением Specter + Meltdown системные вызовы обходятся дороже, чем раньше. Вы расходуете измеримое количество дополнительного процессорного времени в течение этой копии. Также>(cat > foo)
не легче понять, чемfoo
, IMO.Nitpick в ответе @ bertieb, который гласит: В этом примере показано, как тройник используется для обхода врожденного ограничения в команде sudo. sudo не может передать стандартный вывод в файл.
Не существует внутренних ограничений, только неправильное понимание того, как обрабатывается команда.
Пример:
sudo echo 0 > /proc/sys/net/ipv4/ip_forward
Текущая оболочка разбирает командную строку. Он находит перенаправление вывода и выполняет это. Затем он выполняет команду, которая является
sudo
и предоставляет оставшуюся командную строку в качестве аргументов для выполняемой команды. Если текущая оболочка не имеет прав доступа root, перенаправление вывода завершится ошибкой.echo 0 | sudo tee /proc/sys/net/ipv4/ip_forward
Это работает, потому что перенаправление вывода откладывается на
tee
команду, которая на тот момент имеет права root, потому что она была выполнена с помощьюsudo
.sudo bash -c "echo 0 > /proc/sys/net/ipv4/ip_forward"
Это работает, потому что у оболочки, выполняющей перенаправление, есть права root.
источник
sudo
команда, но не выходной файл, и перенаправление работает очень хорошо:sudo foo-needs-privilege > /tmp/this-output-file-doesnt
Как уже упоминали другие, вывод
tee
команды в команду записывает эти выходные данные как в файл, так и в стандартный вывод.Я часто использую,
tee
когда хочу захватить выходные данные из команды, выполнение которой занимает много времени, а также хочу визуально проверить выходные данные, поскольку команда делает их доступными. Таким образом, мне не нужно ждать завершения команды, прежде чем я проверю вывод.То, что, кажется, еще не было упомянуто (если я не пропустил это), это то, что
tee
команда также может записывать несколько файлов одновременно. Например:запишет все
*.png
файлы в текущем каталоге в два разных файла (a.txt
иb.txt
) одновременно.Фактически, вы можете набирать текст сразу в нескольких разных файлах
tee
следующим образом:источник
Наиболее распространенное использование tee - видеть текст на терминале одновременно с отправкой его в файл (или файлы). Формулировка вашего вопроса предполагает, что вы когда-либо пишете текст в лог-файлы. У меня есть сценарии, которые пишут списки имен файлов или каталогов для запуска файлов (для асинхронной обработки другими сценариями), и я использую tee для отправки того же контента на стандартный вывод. Весь stdout направлен на логи. Итак, у меня есть текст, где я хочу, и у меня есть запись в журнале, в которой я это сделал, все из одного утверждения 'echo'
Это также лучший метод в Unix для создания нескольких одинаковых файлов. Я иногда использую его для создания нескольких пустых файлов, как это ...
источник
touch
? (больше сразу видно, что происходит)touch
не будет обрезать файлы, если они уже существуют, а только обновит свои временные метки и оставит их содержимое как есть; ноtee
обрежет их. Кроме того, выполнениеrm
+touch
отличается отtee
(подумайте о жестких и символическихtruncate -s 0
? :-)Представьте, что вы хотите записать вывод команды в файл журнала и распечатать на стандартный вывод. Когда вам нужно сделать это одновременно, тогда вам нужно
tee
.Вариант использования - иметь сценарии сборки, которые записывают всю сборку в стандартный вывод (например, для Jenkins), но одновременно важные вещи в отдельный файл журнала (для сводных электронных писем).
Вы действительно начнете скучать,
tee
когда вам придется сценарий в Windows. Нетtee
и это действительно раздражает.источник
tee
. Cmd никогда не предназначался для серьезных сценариев - для этого и был VBS. Powershell - это новый инструмент для написания скриптов. Конечно, Cmd все еще довольно мощный, но инструментов командной строки довольно мало.