Efecto en el operador de tubería de shell en stdin, stdout y stderr

Cuando creo un tubo usando el shell, por ejemplo:

ls | cat 

Lo que sé con certeza es que el stdin para cat será el stdout para ls (es decir, todo lo que escriba en su stdout , cat lo leerá en su stdin ).

Ahora tengo dos preguntas:

  1. ¿Será el stdin para ls el stdout para cat ?
  2. ¿El operador de tuberías está afectando al stderr tanto para ls como para cat , o seguirá siendo el valor de stderr henetworkingado del shell?

Técnicamente, en ls | cat ls | cat

  • el stdout de ls (su fd 1) será el extremo de escritura de un tubo (o par de zócalos con ksh93 en algunos sistemas).
  • el stdin de cat (su fd 0) será el final de lectura de ese mismo conducto
  • ambos commands se ejecutarán simultáneamente (se inician al mismo time en processs separados)
  • stdin of ls no se ve afectado (pregunta 1)
  • stdout of cat no se ve afectado (pregunta 1)
  • stderr (fd 2) de ls o cat no se ven afectados (pregunta 2).

Para que el stderr de ls también vaya al extremo de escritura de la tubería (para que cat pueda leer de su stdin en el otro extremo de la tubería), puede hacer:

 ls 2>&1 | cat 

Que dice: "hacer que fd 2 apunte al mismo recurso que en fd 1 (aquí la tubería)"

Con csh , tcsh , zsh o bash 4.0 o superior, también puede escribirlo:

 ls |& cat 

En sistemas donde las tuberías son bidireccionales, podrías hacer:

 ls <&1 | cat >&0 

hacer que el stdout de cat sea ​​retroalimentado a ls través de esa misma tubería pero en la dirección inversa, pero eso sería inútil ya que nunca lee desde su stdin.

En Linux, donde las tuberías no son bidireccionales, ese command daría un error.