tuberias - salidas estandar en linux
solo tubería stderr a través de un filtro (5)
¿Hay alguna forma, en bash, de conectar el stderr a través de un filtro antes de unificarlo con stdout? Es decir, quiero
stdout ----------------/
|-----> terminal/file/whatever
stderr -- [ filter ] --/
más bien que
stdout ----/
|----[ filter ]---> terminal/file/whatever
stderr ----/
Aquí hay un ejemplo, modelado después de cómo intercambiar descriptores de archivos en bash . La salida de a.out es la siguiente, sin el prefijo ''STDXXX:''.
STDERR: stderr output
STDOUT: more regular
./a.out 3>&1 1>&2 2>&3 3>&- | sed ''s/e/E/g''
more regular
stdErr output
Citando del enlace de arriba:
- Primero guarde stdout como & 3 (y 1 se engaña en 3)
- Luego envíe stdout a stderr (y 2 se engaña en 1)
- Enviar stderr a & 3 (stdout) (& 3 está engañado en 2)
- cerrar & 3 (& - está engañado en 3)
Eche un vistazo a las tuberías con nombre:
$ mkfifo err
$ cmd1 2>err |cat - err |cmd2
Encuentro que el uso de la sustitución del proceso bash es más fácil de recordar y usar, ya que refleja la intención original casi textualmente. Por ejemplo:
$ cat ./p
echo stdout
echo stderr >&2
$ ./p 2> >(sed -e ''s/s/S/'') | sed ''s/t/T/''
sTdout
STderr
utiliza el primer comando sed como filtro en stderr solamente y el segundo comando sed para modificar el resultado unido.
Tenga en cuenta que el espacio en blanco después de 2> es obligatorio para que el comando se analice correctamente.
La última parte de esta página de Advanced Bash Scripting Guide es "redirigir solo stderr a una tubería".
# Redirigir solo stderr a una tubería.
exec 3>&1 # Save current "value" of stdout. ls -l 2>&1 >&3 3>&- | grep bad 3>&- # Close fd 3 for ''grep'' (but not ''ls''). # ^^^^ ^^^^ exec 3>&- # Now close it for the remainder of the script.
# Gracias, SC
Esto puede ser lo que quieres. Si no, alguna otra parte del ABSG debería poder ayudarlo, es excelente.
Un uso ingenuo de sustitución de procesos parece permitir el filtrado de stderr
separado de stdout
:
:; ( echo out ; echo err >&2 ) 2> >( sed s/^/e:/ >&2 )
out
e:err
Tenga en cuenta que stderr
aparece en stderr
y stdout
en stdout
, que podemos ver envolviendo todo en otra subshell y redirigiendo a los archivos o
e
( ( echo out ; echo err >&2 ) 2> >( sed s/^/e:/ >&2 ) ) 1>o 2>e