Trovo che il comando tee
sia molto utile nel debug degli script di shell che contengono pipeline lunghe. Questa è la fine di uno spaventoso script di shell che è in ritardo da un decennio per una riscrittura in Perl, ma funziona ancora. (E 'stato modificato l'ultima volta nel 1998, come accade.)
# 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
I tre script sed che vengono eseguiti sono orribile - non ho intenzione di mostrare loro. Questo è anche un uso semi-decente di eval
. I normali nomi di file temporanei ($ tmp.1, ecc.) Sono preservati da un nome fisso (tmp.1, ecc.) E i risultati intermedi sono conservati in tmp.4 .. tmp.7. Se stavo aggiornando il comando, userebbe '"[email protected]#"
' invece di '$*
' come mostrato. E, quando eseguo il debug, non c'è un solo file nell'elenco degli argomenti, quindi il calpestamento dei file di debug non è un problema per me.
Si noti che se è necessario, è possibile creare più copie dell'input contemporaneamente; non è necessario alimentare un comando tee
in un altro.
Se qualcuno ne ha bisogno, ho una variante di tee
denominata tpipe
che invia copie dell'output a più pipeline anziché a più file. Continua anche se una delle pipeline (o output standard) termina presto. (Vedi il mio profilo per informazioni di contatto.)
fonte
2009-04-19 00:58:31
': w sudo tee%' http://stackoverflow.com/a/7078429/739331 –