Me parece que el comando tee
es muy útil en la depuración de scripts de shell que contienen tuberías de gran longitud. Este es el final de un guión fantasmal que está atrasado hace una década para una reescritura en Perl, pero todavía funciona. (Fue modificada en 1998 por última vez, como sucede.)
# 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
Los tres guiones de sed que se ejecutan son espantosa - No planeo para mostrarlos. Este también es un uso semi-decente de eval
. Los nombres de archivos temporales normales ($ tmp.1, etc.) se conservan con un nombre fijo (tmp.1, etc.) y los resultados intermedios se conservan en tmp.4 .. tmp.7. Si estuviera actualizando el comando, usaría '"[email protected]#"
' en lugar de '$*
' como se muestra. Y, cuando lo estoy depurando, no hay más que un archivo en la lista de argumentos, por lo que el pisoteo de los archivos de depuración no es un problema para mí.
Tenga en cuenta que si necesita hacerlo, puede crear varias copias de la entrada a la vez; no es necesario alimentar un comando tee
a otro.
Si alguien lo necesita, tengo una variante de tee
llamada tpipe
que envía copias de la salida a varias tuberías en lugar de varios archivos. Sigue funcionando incluso si uno de los conductos (o salida estándar) termina antes de tiempo. (Ver mi perfil para información de contacto.)
':! W sudo tee'% http://stackoverflow.com/a/7078429/739331 –