Dos ventanas, mismo usuario, con mensajes de bash. En la ventana-1 escriba:
$ mkfifo f; exec <f
Entonces bash ahora está intentando leer desde el descriptor de archivo 0, que se asigna a la canalización con nombre f
. En la ventana-2, escriba:
$ echo ls > f
Ahora la ventana-1 imprime un ls y luego el caparazón muere. ¿Por qué?
Siguiente experimento: abra la ventana-1 nuevamente con exec <f
. En la ventana-2, escriba:
$ exec 3>f
$ echo ls >&3
Después de la primera línea anterior, la ventana 1 se activa e imprime un mensaje. ¿Por qué? Después de la segunda línea anterior, la ventana-1 imprime la ls
salida y el shell permanece vivo. ¿Por qué? De hecho, ahora en window-2, echo ls > f
no cierra el shell de window-1.
¡La respuesta debe tener que ver con la existencia del descriptor de archivo 3 de la ventana-2 que hace referencia a la tubería con nombre?
exec 3>f
se ejecuta, el primer shell emite un aviso. (Punto menor, ¿quiso decir "en modo de escritura " en su comentario?)
exec <f
,bash
no está tratando de leer a partirf
, primero se intenta abrir la misma. Elopen()
no regresará hasta que haya algún proceso de hacer otro abierto en el modo de escritura en el tubo (momento en el que el tubo se crea una instancia, y la cáscara leerá de entrada de ella).