una tuberias tuberia salidas salida que por pipes operador nombre filtrar estandar enviar comando archivo linux bash redirect

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:

  1. Primero guarde stdout como & 3 (y 1 se engaña en 3)
  2. Luego envíe stdout a stderr (y 2 se engaña en 1)
  3. Enviar stderr a & 3 (stdout) (& 3 está engañado en 2)
  4. 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