Unix: запутанное использование Tee-команды

руководство заявляет что тройник "штуцер трубы" - инструмент. Дела [1] путай меня:

1. дело

echo "foo bar" | sudo tee -a /path/to/some/file

2. дело

:w !sudo tee %

трудно понять логику тройника из случаев. Как работает футболка?

8 ответов


tee обычно используется для разделения вывода программы, так что он может быть отображен и сохранен в файле. Команда может использоваться для захвата промежуточного вывода перед изменением данных другой командой или программой. Команда Tee считывает стандартный ввод, затем записывает его содержимое в стандартный вывод. Он одновременно копирует результат в указанный файл(ы) или переменных

tee [OPTION]... [FILE]...

например

tee [ -a ] [ -i ]... [ File ]...
  • -a добавляет вывод в конец файла вместо записи поверх него.

  • -i игнорирует прерывания.

enter image description here

С sudo и добавление к файлу с вашим примером в вопросе

ls -l | sudo tee -a file.txt 

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

echo "foo bar" | sudo tee -a /path/to/some/file

"foo bar" будет повторяться до стандартного вывода и добавляется /path/to/some/file. Подумайте о тройнике, как о соединении " т " в трубе, разделяющем выход на две другие трубы.


tee копии stdin to stdout (как cat) и дополнительно записывает все в файл. Используя его таким образом с sudo позволяет передавать информацию в привилегированном режиме и - в то же время-контролировать, пошел ли туда правильный материал.

Также обратите внимание, что из-за того, как перенаправление обрабатывается в оболочке, почти эквивалентно

sudo echo "foo bar" > /path/to/some/file

не будет работать, так как перенаправление будет сделано вызывающим пользователем, а не sudo целевой пользователь.


объяснения по делам

1. эскалация разрешений с помощью команд sudo - and-tee

пример - это не просто логика, а скорее условность. это показывает Соглашение для эскалации permissions:

echo "Body of file..." | sudo tee root_owned_file > /dev/null

в этом примере показано, что tee используется для обойти ограничение в команда sudo. sudo не может трубить стандартный вывод в файл. От демпинг его поток stdout в /dev / null, мы также подавляем зеркальный вывод в консоли.

2. запуск sudo-команд с помощью Vim

поскольку вы можете использовать Sudo-команды с Vim, вы можете использовать команду, если вы забыли запустить как sudo. Это полезно в таких местах, как /etc/init.Д/, где вы найдете файлы только для чтения.

логика с tee-командой

это похоже на ветку в Git, или лучше, пожалуйста, см. аналогия T Рика Коупленда. Надеюсь, измененный пример (оригинал) помогает понять его использование:

curl "http://en.wikipedia.org/wiki/Pipeline_(Unix)" | tee original_site | sed 's/[^a-zA-Z ]/ /g' | tr 'A-Z ' 'a-z\n' | grep '[a-z]' | sort -u | comm -23 - /usr/share/dict/words

помните, что цель tee не ограничивается обычными файлами, но может быть устройствами, FIFOs и т. д. Кроме того, вы можете трубить другому tee вызова, и так далее. :-)


Я считаю, что очень полезна при отладке сценариев оболочки, содержащих длинные конвейеры. Это хвост ужасного сценария оболочки, который на десять лет просрочен для перезаписи в Perl, но он все еще работает. (Последний раз он был изменен в 1998 году.)

# If $DEBUG is yes, record the intermediate results.
if [ "$DEBUG" = yes ]
then
    cp $tmp.1 tmp.1
    cp $tmp.2 tmp.2
    cp $tmp.3 tmp.3
    tee4="| tee tmp.4"
    tee5="| tee tmp.5"
    tee6="| tee tmp.6"
    tee7="| tee tmp.7"
fi

# The evals are there in case $DEBUG was yes.
# The hieroglyphs on the shell line pass on any control arguments
# (like -x) to the sub-shell if they are set for the parent shell.
for file in $*
do
    eval sed -f $tmp.1 $file                $tee4 |
    eval sed -f $tmp.3                      $tee5 |
    eval sh ${-+"-$-"}                      $tee6 |
    eval sed -f $tmp.2                      $tee7 |
    sed  -e '1s/^[  ]*$/--@/' -e '/^--@/d'
done

три сценария sed, которые запускаются, ужасны - я не планирую их показывать. Это также полу-достойное использование eval. Обычные временные имена файлов ($tmp.1, etc) сохранены фикчированным имя (tmp.1 и т. д.), и промежуточные результаты сохраняются в tmp.4 .. ПТМ.7. Если бы я обновлял команду, она бы использовала '"$@#" "вместо"$*', как показано. И когда я отлаживаю его, в списке аргументов Есть только один файл, поэтому топтание файлов отладки не является проблемой для меня.

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

если кому-то это нужно, у меня есть вариант tee под названием tpipe который отправляет копии выходных данных в несколько конвейеров вместо нескольких файлов. Он продолжает работать, даже если один из трубопроводов (или стандартный выход) заканчивается рано. (См. мой профиль для контактной информации.)


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

в случае, если вы показываете, что tee вызывается как суперпользователь (через sudo), и единственная цель-написать файл как суперпользователь, если пользователь, который делает Эхо.


команда tee просто создает N + 1 no файлов, 1 копия передается в stdout и другие аргументы, предоставленные tee (т. е. файлы ) где n-число agruments прошел в тройник