2010-06-29 17 views
21

Mi piacerebbe avere lo stdout di un comando replicato anche su stderr sotto bash. Qualcosa di simile:Duplicare lo stdout allo stderr

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

dove (...) è l'espressione di reindirizzamento. È possibile?

+0

Sede [Come posso inviare stdout di comandi multipli?] (Http://unix.stackexchange.com/questions/28503/how-can-i-send-stdout-to-multiple-commands) –

risposta

41

Usa tee con/dev/stderr:

echo "FooBar" | tee /dev/stderr 

o utilizzare awk/Perl/Python per fare manualmente la replica:

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

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

virgola non necessaria dopo STDERR nell'esempio perl – Znik

+0

che è più portabile tra i sistemi operativi e tra le shell? 'tee/dev/stderr' o' tee> (cat> & 2) '? –

+0

Scommetto che quest'ultimo è più compatibile multipiattaforma visto che '/ dev/stderr' non è disponibile su ogni distribuzione. – Qix

0

Per il reindirizzamento a stderr, vorrei utilizzare >&2 o >/dev/stderr. Per replicare l'output, vorrei usare tee. Lo svantaggio di questo è che un file temporaneo è necessario:

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

errato. hai la possibilità di ottenere un grande flusso e riempire completamente il dispositivo/tmp, solitamente connesso al filesystem/root. – Znik

+0

@Znik - '/ tmp/stdout' è solo un esempio. Sentiti libero di sostituire quel nome di file con quello che è più appropriato nel tuo contesto. – mouviciel

9

Usa processo di sostituzione: http://tldp.org/LDP/abs/html/process-sub.html

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

Tee accetta un nome file come parametro e duplica l'output in questo file. Con la sostituzione del processo è possibile utilizzare un processo anziché il nome file >(cat) ed è possibile reindirizzare l'output da questo processo allo stderr >(cat >&2).

+0

Questa è una buona soluzione per sistemi operativi come OS X, che non ha il file system/proc. – Meow

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

che non funziona con RedHat 6,3

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

sta lavorando

+0

scusa, aggiunta aggiunta ;-) – defdefred

Problemi correlati