Uważam, że polecenie tee
jest bardzo przydatne w debugowaniu skryptów powłoki, które zawierają długie potoki. Jest to koniec upiornego skryptu powłoki, który jest od dziesięcioleci opóźniony w przepisywaniu w Perlu, ale nadal działa. (To był ostatnio modyfikowany w 1998 roku, jak to się dzieje.)
# 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
The trzech sed skryptów, które są uruchamiane są upiornie - Nie zamierzam im pokazać. Jest to również przyzwoite użycie eval
. Normalne nazwy plików tymczasowych ($ tmp.1, itp.) Są zachowywane przez stałą nazwę (tmp.1, itp.), A wyniki pośrednie są zachowywane w tmp.4 .. tmp.7. Gdybym aktualizował polecenie, użyłbym ""[email protected]#"
" zamiast "$*
", jak pokazano. I kiedy debuguję to, to jest tylko jeden plik na liście argumentów, więc deptanie plików debugowania nie jest dla mnie problemem.
Zauważ, że jeśli trzeba to zrobić, można utworzyć kilka kopii wejściu w jednym czasie; nie ma potrzeby, aby nakarmić jedną tee
polecenia do innego.
Jeśli ktoś potrzebuje, mam wariant tee
o nazwie tpipe
, który wysyła kopie danych wyjściowych do wielu potoków zamiast wielu plików. Trwa nawet, gdy jeden z potoków (lub wyjście standardowe) kończy się wcześniej. (Zobacz mój profil dla informacji kontaktowych.)
': w! Sudo tee%' http://stackoverflow.com/a/7078429/739331 –