Bash 4.4 변경 로그에 따르면:
https://lists.gnu.org/archive/html/info-gnu/2016-09/msg00008.html
bash-4.3과 bash-4.4 사이에는 호환되지 않는 변경 사항이 있습니다. Bash는 이제 모든 작업이 아닌 비동기 작업의 종료 상태만 유지합니다. 이는 이전에 완료된 동기화 명령의 상태를 검색하기 위해 "대기"를 사용할 수 없음을 의미합니다.
https://fossies.org/diffs/bash/4.3.46_vs_4.4/CHANGES-diff.html
Bash는 많은 하위 프로세스를 생성하고 가져오는 스크립트 중에 테이블이 너무 커지는 것을 방지하기 위해 상태를 기억하는 배경 pid 테이블에만 비동기 명령을 추가합니다. 즉, "대기"는 더 이상 동기화 작업에 작동하지 않지만 이러한 경우 종료 상태를 가져오는 데 $?를 사용할 수 있습니다.
저는 이미 4.3과 4.4 사이의 다른 주요 변경 사항에서 막혔지만 이 특정 변경 사항을 테스트하기 위해 샘플을 작성하는 방법을 모르겠습니다.
Bash에서 동기 작업과 비동기 작업의 차이점은 무엇입니까? 쿼리 대기 중인 pid 테이블은 어디에 저장되나요?
답변1
예:
4.3
bash-4.3$ (echo "$BASHPID"; exit 123)
5358
bash-4.3$ wait 5358; echo "$?"
123
4.4
bash-4.4$ (echo "$BASHPID"; exit 123)
12171
bash-4.4$ wait 12171
bash: wait: pid 12171 is not a child of this shell
wait
더 이상 포그라운드에서 (동기적으로) 실행 중인 서브셸의 종료 상태를 가져오는 데 를 사용할 수 없습니다 .전망대화형 셸에 대한 작업을 참조하지만 비대화형 셸에서 실행되는 명령에도 동일하게 적용됩니다.
나중에 다음을 통해 포그라운드로 가져오는 백그라운드 작업에도 작동합니다 fg
.
bash-4.4$ (sleep 10; exit 123) &
[1] 12857
bash-4.4$ fg
( sleep 10; exit 123 )
bash-4.4$ wait 12857
bash: wait: pid 12857 is not a child of this shell
with bash-4.3
와 before는 bash
모든 과거 배경 및 전경 명령의 종료 상태를 기억합니다. 일반적으로 스크립트의 pid나 다음 사항을 모르기 때문에 전경 명령에는 유용하지 않습니다.
cmd1 &
...
cmd2
wait "$!"
cmd1
PID가 재사용되었을 가능성이 높습니다 cmd2
. 이 경우 종료 상태가 대신 wait "$!"
표시됩니다 . 비동기 명령의 pid만 기록하면 명령에 대한 잘못된 종료 상태가 발생할 위험이 약간 줄어듭니다(@Christopher가 언급한 성능 문제 외에도).cmd2
cmd1
wait