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 archivo3
que se configura en el actual1
(stdout original) solo para guardarlo en alguna parte. -
1>&2-
establece stdout para llegar al archivo actual handle2
(stderr original) y luego cierra2
. -
2>&3-
establece stderr para llegar al archivo actual handle3
(stdout original) y luego cierra3
.
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)