나는 사용하려고공동 프로세스비동기 프로세스의 출력을 다른 셸 명령으로 파이프한 다음 비동기 프로세스의 종료 상태를 확인합니다.
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_PID
coprocess가 종료될 때 설정되지 않는 변수에 값을 저장합니다.
이 됩니다.아니요PID를 가져올 시간이 되기 전에 코루틴이 종료되면 작동하므로 변수를 사용하기 전에 변수에 값이 있는지 확인하는 것이 현명할 수 있습니다.