2010-06-29 12 views
21

Me gustaría tener la stdout de un comando replicado en stderr también en bash. Algo como:Duplicar stdout a stderr

$ echo "FooBar" (...) 
FooBar 
FooBar 
$ 

donde (...) es la expresión de redirección. ¿Es eso posible?

+0

Ver [¿Cómo puedo enviar la salida estándar a varios comandos?] (Http://unix.stackexchange.com/questions/28503/how-can-i-send-stdout-to-multiple-commands) –

Respuesta

41

Uso tee con/dev/stderr:

echo "FooBar" | tee /dev/stderr 

o usar awk/Perl/Python que hacer manualmente la replicación:

echo "FooBar" | awk '{print;print > "/dev/stderr"}' 

echo "FooBar" | perl -pe "print STDERR, $_;" 
+1

coma innecesaria después de STDERR en el ejemplo perl – Znik

+0

que es más portátil en todos los SO y en Shells? 'tee/dev/stderr' o' tee> (cat> & 2) '? –

+0

Apostaría que este último es más compatible con múltiples plataformas, ya que '/ dev/stderr' no está disponible en todas las distribuciones. – Qix

0

Para redireccionar a stderr, usaría >&2 o >/dev/stderr. Para replicar la salida, usaría tee. El inconveniente de esto es que se necesita un archivo temporal:

echo "FooBar" | tee /tmp/stdout >&2 ; cat /tmp/stdout 
+0

mal. usted tiene la oportunidad de obtener un gran flujo y completar completamente el dispositivo/tmp, generalmente conectado al sistema de archivos/root. – Znik

+0

@Znik - '/ tmp/stdout' es solo un ejemplo. Siéntase libre de reemplazar ese nombre de archivo con lo que sea más apropiado en su contexto. – mouviciel

9

uso proceso de sustitución: http://tldp.org/LDP/abs/html/process-sub.html

echo "FooBar" | tee >(cat >&2)

Tee toma un nombre de archivo como parámetro y duplica la salida a este archivo. Con la sustitución de procesos puede usar un proceso en lugar del nombre de archivo >(cat) y puede redireccionar el resultado de este proceso a stderr >(cat >&2).

+0

Esta es una buena solución para sistemas operativos como OS X, que no tiene el sistema de archivos/proc. – Meow

-1
echo "FooBar" |tee /dev/stderr 
tee: /dev/stderr: Permission denied 

que no trabajan con RedHat 6,3

echo "FooBar" | (read A ; echo $A ; echo $A >&2) 

está trabajando

+0

lo siento, explicación agregada ;-) – defdefred

Cuestiones relacionadas