Es bien sabido cómo canalizar la salida estándar de un proceso en la entrada estándar de otro proceso:
proc1 | proc2
Pero, ¿qué sucede si quiero enviar el error estándar de proc1 a proc2 y dejar que la salida estándar vaya a su ubicación actual? Se podría pensar bash
que tendría un comando en la línea de:
proc1 2| proc2
Pero, por desgracia, no. ¿Hay alguna forma de hacer esto?
rc
, que es otro shell. Por ejemplo:proc1 |[2] proc2
. ¿No es lindo?bash
Aunque no en .Respuestas:
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:Pero puede sustituir un proceso para el archivo de la siguiente manera:
Aquí hay un ejemplo concreto que se envía
stderr
tanto a la pantalla como a un archivo de registro.fuente
weston --help 2> >(less)
), y rompió mi caparazón, tuve que salir y volver a iniciar sesión.weston --help
yless
esperan tener interacción con el teclado, pero solo 1 de ellos lo recibe, entonces puede estar en una situación incómoda. Intente hacer pruebas con algo como en sugrep
lugar. Además, es posible que ambas entradas del mouse / teclado vayan al segundo comando de todos modos en lugar de a Weston.Puedes usar el siguiente truco para intercambiar
stdout
ystderr
. Entonces solo usa la funcionalidad de tubería normal.Siempre
stdout
ystderr
ambos señalaron la misma posición en la salida, esto le dará lo que necesita.Lo que hace el
x>y
bit es cambiar el identificador de archivox
para que ahora envíe su información a dondey
apunta actualmente el identificador de archivo . Para nuestro caso específico:3>&1
crea un nuevo identificador3
que saldrá al identificador actual1
(stdout original), solo para guardarlo en algún lugar para el último punto de viñeta a continuación.1>&2
modifica el manejador1
(stdout) para enviarlo al manejador actual2
(stderr original).2>&3-
modifica el manejador2
(stderr) para que salga al manejador actual3
(stdout original) y luego cierra el manejador3
(a través de-
al final).Es efectivamente el comando de intercambio que ves en los algoritmos de clasificación:
fuente
1>&2-
aquí en lugar de solo1>&2
? No entiendo por qué querríamos cerrar fd2
, si solo vamos a reabrirlo / reasignarlo de inmediato.Bash 4 tiene esta característica:
zsh también tiene esta característica.
-
Con otros shells / antiguos, simplemente ingrese esto explícitamente como
FirstCommand 2> y 1 | OtroCommand
fuente
OtherCommand
escribe los datos combinados en alguna parte, posiblemente en otra parte. Por lo tanto, no son los mismos datos, y potencialmente van a otro lado. Eso es casi lo opuesto al deseo del OP, ¿no?proc1
sale a stdout y stderr y quieres que stderr vaya al stdin deproc2
(que es a donde va el stdout de proc1), entonces mi respuesta logra eso. Le di al OP lo que pidió , quizás no lo que quería pedir. Ahí radica la posible ambigüedad. El OP aceptó la respuesta que intercambia stdout y stderr que no es lo que pidió.El intercambio es excelente ya que resuelve el problema. En caso de que ni siquiera necesite el stdout original, puede hacerlo de esta manera:
El orden es vital; no querrías
Como esto redirigirá todo a
/dev/null
!fuente
Ninguno de estos realmente funcionó muy bien. La mejor manera que encontré de hacer lo que querías es:
Esto solo funciona en casos donde
command
no necesita entrada de teclado. p.ej:pondría errores gzip en menos
fuente