Я считаю, что команда 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 и т. д.) сохраняются под фиксированным именем (tmp.1 и т. д.), а промежуточные результаты сохраняются в tmp.4 .. tmp.7. Если бы я обновлял команду, она использовала бы «"$@#"
» вместо «$*
», как показано. И, когда я его отлаживаю, то в списке аргументов есть только один файл, поэтому трампание файлов отладки для меня не проблема.
Обратите внимание, что если вам нужно это сделать, вы можете создать несколько копий ввода одновременно; нет необходимости передавать одну команду tee
в другую.
Если кому-то это нужно, у меня есть вариант tee
под названием tpipe
, который отправляет копии вывода в несколько конвейеров вместо нескольких файлов. Он продолжает работать, даже если один из конвейеров (или стандартный вывод) завершается досрочно. (См. мой профиль для контактной информации.)
person
Jonathan Leffler
schedule
19.04.2009
:w !sudo tee %
stackoverflow.com/a/7078429/739331 - person Mohammed H   schedule 09.05.2015