si quiero mostrar "aaa" en la pantalla:
(1)$: echo aaa | cat ... works OK
(2)$: echo aaa | ( cat ) ... works OK
(3)$: echo aaa | ( cat & ) ... NOT working
(4)$: ( echo aaa & ) | cat ... works OK
(5)$: echo aaa | ( cat <&0 & ) ... works ok in BASH (but not in SH)
(6)$: echo aaa | ( cat <&3 & ) 3<&0 ... works ok in BASH and SH
La exclusión de (3) y (4) -> proceso separado todavía tiene una salida conectada que puede ser controlada, utilizada, redirigida ... ¡pero no entrada!
Mi pregunta es: ¿alguien entiende por qué y cómo funciona la línea (5) ?
... "<& 0" es la abreviatura de "0 <& 0", por qué redirigir 0 a 0 es la solución, y lo que realmente sucede detrás con la entrada del proceso separado. Los subshell no son el problema, usar llaves {...} en lugar de (...) proporciona los mismos resultados.
... y pregunta2: ¿hay una mejor solución para "dar entrada al proceso separado" que la línea (6).
fuente
bash
interpreta (y eso suena como una interpretación razonable) como cancelar la/dev/null
redirección. Ahora, no muchas conchas hacen lo mismo. Ash y pdksh no.3<&-
necesita la pieza y es seguro usarla (no cerrará la tubería antes de que se lea la entrada completa)?cmd
no lo necesita. Lo cerramos después de haberlo duplicado en fd 0 (<&3
abreviatura de0<&3
).nohup
también redirige la entrada estándar a / dev / null, por lo que se necesitaría:{ nohup sh -c 'cmd <&3 3<&-' & } 3<&0
. O(trap '' HUP; cmd <&3 3<&- > nohup.out 2>&1 &) 3<&0