Подтвердить что ты не робот

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

В ручном режиме указано, что тройник является "приспособлением для соединения труб". Случаи [1] путают меня:

1. Случай

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

2. Случай

:w !sudo tee %

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

4b9b3361

Ответ 1

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

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

Например

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

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

введите описание изображения здесь

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

ls -l | sudo tee -a file.txt 

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Объяснения для случаев

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

Пример не только о логике, а скорее о согласии. В нем показано соглашение об увеличении разрешений:

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

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

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

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

Логика с ти-командой

Это как ветка в 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

Ответ 5

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

Ответ 6

Я нахожу, что команда tee очень полезна при отладке сценариев оболочки, содержащих длинные конвейеры. Это хвост ужасной оболочки script, которая просрочена для перезаписи в 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/^[  ]*$/[email protected]/' -e '/^[email protected]/d'
done

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

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

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

Ответ 7

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

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

Ответ 8

Команда

tee просто создает N + 1 файлов, 1 экземпляр передан в stdout и другие аргументы, предоставленные tee (т.е. файлы) где N: количество агрументов, переданных tee