으로 bash
, 당신은 당신이 다른 백그라운드 작업을 시작했습니다 않는 것을 보장해야합니다 (그리고 조심 그 배경 작업을 시작할 수 있습니다 &
뿐만 아니라 함께 coproc
사이 및 공정의 대체와) foo &
과 wait
.
POSIX는 쉘이 최소한 25 개의 작업이 종료 된 후 종료 상태를 기억해야 하지만 bash
그 이상을 기억해야합니다.
지금, 당신이 할 경우 :
foo & pid=$!
...
bar &
wait "$pid"
당신은 ( 시작 시간에 의해 종료 된 경우) bar
와 동일한 pid가 제공되지 않을 것이라는 보장을 하지 않으므로 가능성이 낮더라도 종료 상태를 제공 할 수 있습니다 .foo
foo
bar
wait "$pid"
bar
다음과 같이 재현 할 수 있습니다.
bash -c '(exit 12; foo) & pid=$!
while : bar & [ "$pid" != "$!" ]; do :;done
wait "$pid"; echo "$?"'
결국에는 0
대신에 당신에게 줄 것입니다 12
.
문제를 피하기 위해 한 가지 방법은 다음과 같이 작성하는 것입니다.
{
foo_pid=$!
while ps -p "$foo_pid"
do
ping -c 1 localhost
done
bar &
...
read <&3 ret
if [ "$ret" = 0 ]; then
echo foo was sucessful.
fi
} 3< <(foo > logfile 2>&1; echo "$?")
wait
작동하지 않습니다. 프롬프트가 표시되기 직전에 프로세스가 수집되고 종료 상태가 삭제됩니다 (기본적으로).