다음 사항에 차이점이 있는지 알고 싶습니다.
long_running.sh &
pid=$!
그리고
(
long_running.sh
) &
pid=$!
두 경우 모두 PID가 일관되게 캡처됩니까, 아니면 약간의 차이가 있습니까?
궁극적으로 다음을 통해 의미 있는 종료 코드를 캡처하고 싶습니다.
wait ${pid} || { echo "damn"; exit 1; };
답변1
약간의 테스트를 통해 이전 의견이 잘못된 것으로 나타났습니다.
$ cat long_running.sh
#!/bin/bash
sleep 3
echo "long_running: $$"
pstree -ps $$
status=$((RANDOM % 2))
echo "exiting with status $status"
exit $status
$ ./long_running.sh
long_running: 6599
systemd(1)───gnome-terminal-(4112)───bash(5899)───long_running.sh(6599)───pstree(6601)
exiting with status 1
$ ( ./long_running.sh )
long_running: 6618
systemd(1)───gnome-terminal-(4112)───bash(5899)───long_running.sh(6618)───pstree(6621)
exiting with status 0
"중개자" 쉘이 없으므로 bash가 하위 쉘을 생성하고 exec
명령을 실행할 것이라고 생각했습니다.
종료 상태를 캡처하려면 올바른 일을 했습니다.
$ ( ./long_running.sh ) & pid=$!; wait $pid && echo ok || echo damn
[1] 7439
long_running: 7439
systemd(1)───gnome-terminal-(4112)───bash(5899)───long_running.sh(7439)───pstree(7441)
exiting with status 0
[1]+ Done ( ./long_running.sh )
ok
$ ( ./long_running.sh ) & pid=$!; wait $pid && echo ok || echo damn
[1] 7457
long_running: 7457
systemd(1)───gnome-terminal-(4112)───bash(5899)───long_running.sh(7457)───pstree(7461)
exiting with status 1
[1]+ Exit 1 ( ./long_running.sh )
damn