화면에 "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)보다 있습니까?
답변1
예,POSIX 요구 사항에 따르면, 백그라운드에서 시작된 명령의 표준 입력이 &
에서 리디렉션됩니다 /dev/null
.
정말
{ cmd <&3 3<&- & } 3<&0
이 문제를 해결하는 가장 확실한 방법입니다.
그러나 파이프라인의 일부가 백그라운드에서 실행되는 이유는 확실하지 않습니다.