Я считаю, что команда tee
очень полезна при отладке сценариев оболочки, содержащих длинные конвейеры. Это конец ужасного сценария оболочки, который на 10 лет запоздал для переписывания в 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
, который отправляет копии вывода в несколько конвейеров, а не в несколько файлов. Он продолжает работать, даже если один из конвейеров (или стандартный вывод) завершается рано. (Смотрите мой профиль для контактной информации.)