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 bashque 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?bashAunque no en .Respuestas:
También hay sustitución de procesos . Lo que hace que un proceso sustituya a un archivo.
Puede enviar
stderra 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
stderrtanto 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 --helpylessesperan 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 sugreplugar. 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
stdoutystderr. Entonces solo usa la funcionalidad de tubería normal.Siempre
stdoutystderrambos señalaron la misma posición en la salida, esto le dará lo que necesita.Lo que hace el
x>ybit es cambiar el identificador de archivoxpara que ahora envíe su información a dondeyapunta actualmente el identificador de archivo . Para nuestro caso específico:3>&1crea un nuevo identificador3que saldrá al identificador actual1(stdout original), solo para guardarlo en algún lugar para el último punto de viñeta a continuación.1>&2modifica 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
OtherCommandescribe 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?proc1sale 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
commandno necesita entrada de teclado. p.ej:pondría errores gzip en menos
fuente