Bash는 coproc을 기다리기 전에 *_PID 변수를 설정 해제합니다.

Bash는 coproc을 기다리기 전에 *_PID 변수를 설정 해제합니다.

나는 사용하려고공동 프로세스비동기 프로세스의 출력을 다른 셸 명령으로 파이프한 다음 비동기 프로세스의 종료 상태를 확인합니다.

coproc LS { ls dir; }
while IFS= read i; do echo "$i"; done <&"$LS" # Do something with the output.
wait "$LS_PID"; echo $? # Check exit status.

문제는 위의 코드가 적어도 Bash에서는 작동하지 않는다는 것입니다 4.3.46(1)-release. while이 명령문을 실행한 후 Bash는 설정을 해제합니다 $LS_PID(아마도 프로세스가 종료되었음을 인지했기 때문일 것입니다). 호출 wait프로세스는 여전히 유효합니다. 예를 들면 다음과 같습니다.

coproc LS { ls dir; }
P=$LS_PID
while IFS= read i; do echo "$i"; done <&"$LS" # Do something with the output.
wait "$P"; echo $? # Check exit status.

이것은 디렉토리가 존재하는지 여부에 따라 인쇄되거나 달라집니다 0. 2그래서 PID를 다른 변수에 저장해야 하는데, 그게 불편할 뿐입니다. 하지만 제가 관심 있는 것은 왜 이런 일이 일어나는지, 그리고 제가 이에 영향을 미칠 수 있는지 여부입니다.

프로세스를 시작하기 $LS_PID전에 왜 설정되지 않았나요? wait이 동작이 어딘가에 문서화되어 있습니까? 명령 출력을 사용하고 종료 코드를 확인하는 것이 일반적인 사용 사례라고 생각되는 간단한 해결 방법이 있습니까?

답변1

COPROC_PID이는 Bash 매뉴얼에 문서화되어 있지 않지만 이 변수의 예상되는 동작입니다 .

올바른 해결책은 이미 수행한 작업을 정확하게 수행하는 것입니다. $COPROC_PIDcoprocess가 종료될 때 설정되지 않는 변수에 값을 저장합니다.

이 됩니다.아니요PID를 가져올 시간이 되기 전에 코루틴이 종료되면 작동하므로 변수를 사용하기 전에 변수에 값이 있는지 확인하는 것이 현명할 수 있습니다.

인용하다:http://gnu-bash.2382.n7.nabble.com/Several-issues-with-coprocesses-regarding-exit-status-td11125.html

관련 정보