tuberias script salida redireccionamiento programacion pasar parametros guardar filtros español ejemplos comandos comando archivo bash pipe stderr

bash - salida - shell script linux español



Con bash, ¿cómo puedo canalizar el error estándar en otro proceso? (4)

Bash 4 tiene esta característica:

Si se usa `| & '', el error estándar de command1 se conecta a la entrada estándar de command2 a través de la tubería; es una abreviatura de 2> y 1 | Esta redirección implícita del error estándar se realiza después de cualquier redirección especificada por el comando.

zsh también tiene esta característica.

-

Con otras conchas más antiguas, simplemente ingrese esto explícitamente como

FirstCommand 2> y 1 | Otro comando

Es bien sabido cómo canalizar la salida estándar de un proceso a otra entrada estándar de procesos:

proc1 | proc2

Pero, ¿qué sucede si deseo enviar el error estándar de proc1 a proc2 y dejar que la salida estándar vaya a su ubicación actual? Uno pensaría que bash tendría un comando como el siguiente:

proc1 2| proc2

Pero, por desgracia, no. ¿Hay alguna manera de hacer esto?


El intercambio es excelente ya que resuelve el problema. En caso de que ni siquiera necesite la stdout original, puede hacerlo de esta manera:

proc1 2>&1 1>/dev/null | proc2

El orden es vital; no querrías:

proc1 >/dev/null 2>&1 | proc1

¡Como esto redirigirá todo a /dev/null !


Puede usar el siguiente truco para cambiar stdout y stderr . Entonces solo usa la funcionalidad de tubería normal.

( proc1 3>&1 1>&2- 2>&3- ) | proc2

Siempre que stdout y stderr al mismo lugar al inicio, esto le dará lo que necesita.

Que hace:

  • 3>&1 crea un nuevo manejador de archivo 3 que se configura en el actual 1 (stdout original) solo para guardarlo en alguna parte.
  • 1>&2- establece stdout para llegar al archivo actual handle 2 (stderr original) y luego cierra 2 .
  • 2>&3- establece stderr para llegar al archivo actual handle 3 (stdout original) y luego cierra 3 .

Es efectivamente el comando de intercambio que ves en la clasificación:

temp = value1; value1 = value2; value2 = temp;


También hay sustitución de procesos . Lo que hace que un proceso sustituya a un archivo.
Puede enviar stderr a un archivo de la siguiente manera:

process1 2> file

Pero puede sustituir un proceso por el archivo de la siguiente manera:

process1 2> >(process2)

Aquí hay un ejemplo concreto que envía stderr a la pantalla y se agrega a un archivo de registro

sh myscript 2> >(tee -a errlog)