Según " Linux: The Complete Reference 6th Edition " (pág. 44), solo puede canalizar STDERR utilizando los |&
símbolos de redireccionamiento.
He escrito un script bastante simple para probar esto:
#!/bin/bash
echo "Normal Text."
echo "Error Text." >&2
Ejecuto este script así:
./script.sh |& sed 's:^:\t:'
Presumiblemente, solo las líneas impresas en STDERR estarán sangradas. Sin embargo, en realidad no funciona así, como veo:
Normal Text.
Error Text.
¿Qué estoy haciendo mal aquí?
fuente
./script.sh > /tmp/stdout_goes_here |& grep 'grepping_script_stderr'
no funciona como se pretende, es decir: redirecciónscript.sh
'sstdout
(que, de acuerdo con el manual del fragmento debe ocurrir primero), y luego permitirgrep
a procesar la secuencia de comandos destderr
. En cambio,stderr
y tdout` ambos terminan enstdout_goes_here
|&
es abreviado para2>&1 |
. Entonces>/tmp/stdout_goes_here |&
redirige stdout a/tmp/stdout_goes_here
, luego2>&1
redirige stderr a donde sea que vaya stdout, que es/tmp/stdout_goes_here
, y finalmente|
no recibe ninguna entrada porque la salida del comando ha sido redirigida. Tenga en cuenta que>&1
redirige a donde quiera que vaya el descriptor de archivo 1 , no a donde terminará yendo el descriptor de archivo 1 . Para canalizar solo stderr y redirigir stdout a un archivo, una forma es2>&1 >/tmp/stdout_goes_here |
.|&
canaliza stderr a stdin, como2>&1 |
, por lo que el próximo programa obtendrá ambos en stdin.fuente
runcommand 2>&1 | tee
? es decirruncommand |& tee
?|&
en bash es solo un atajo (no terriblemente portátil) para2>&1 |
, por lo que debería ver cada línea con sangría.fuente