백그라운드 프로세스 파이프 입력

화면에 “aaa”를 표시하려는 경우 :

(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

(3)과 (4)의 결론-> 분리 된 프로세스는 여전히 제어되고, 사용되며, 리디렉션 될 수 있지만 입력은 할 수없는 출력을 연결했습니다!

내 질문은 : 누군가가 왜 (5) 줄이 작동하는지 이해합니까 ?

… “<& 0″은 “0 <& 0″의 줄임말로, 0을 0으로 재지 정하는 것이 해결책이며 분리 된 프로세스의 입력으로 실제로 발생하는 결과입니다. 서브 쉘은 문제가되지 않으며, (…) 대신 중괄호 {…}를 사용하면 동일한 결과를 얻을 수 있습니다.

… 및 질문 2 : 라인 (6)보다 “분리 된 프로세스에 입력 제공”에 대한 더 나은 솔루션이 있습니까?



답변

예, POSIX에 필요한대로 백그라운드에서 시작된 명령은 &표준 입력이에서 리디렉션되었습니다 /dev/null.

그리고 실제로

{ cmd <&3 3<&- & } 3<&0

이를 해결하는 가장 확실한 방법입니다.

왜 백그라운드에서 파이프 라인의 일부를 실행하고 싶은지 명확하지 않습니다.