Unix: запутанное использование Tee-команды
В ручном режиме указано, что тройник является "приспособлением для соединения труб". Случаи [1] путают меня:
1. Случай
echo "foo bar" | sudo tee -a /path/to/some/file
2. Случай
:w !sudo tee %
Трудно понять логику тройника из случаев. Как работает тройник?
Ответы
Ответ 1
tee
обычно используется для разделения вывода программы, чтобы он мог отображаться и сохраняться в файле. Команда может использоваться для захвата промежуточного вывода до того, как данные будут изменены другой командой или программой. Команда tee считывает стандартный ввод, затем записывает свой контент в стандартный вывод. Он одновременно копирует результат в указанный файл или переменные
tee [OPTION]... [FILE]...
Например
tee [ -a ] [ -i ]... [ File ]...
![введите описание изображения здесь]()
С 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