다음 Bash 스크립트 조각을 고려해보세요.
exec 3> >(sleep 1; echo "$BASHPID: here")
do-something-interesting
exec 3>&-
wait $!
echo "$BASHPID: there"
실행되면 다음이 생성됩니다.
a.sh: line 4: wait: pid 1001 is not a child of this shell
1000: there
1001: here
wait
실제로 종료를 기다리도록 이 줄을 어떻게 수정합니까 1001
? 즉, 출력이 다음과 같이 되도록 스크립트를 변경할 수 있습니다.
1001: here
1000: there
답변1
이 백그라운드 작업은 start 로 bash
설정되어 있지만 이를 기다리거나 수행할 수 있는 다른 작업 (예 : 작업 번호로 참조)을 수행할 수 없습니다. ( 이 기능은 어디서 얻었나요?) 아니면 거기 에도 설정되어 있지 않나요?$!
exec 3> >(job)
job &
fg
bg
ksh93
bash
zsh
$!
표준적이고 이식 가능한 방법을 사용하여 이 작업을 수행할 수 있습니다.
{
{
do-something-interesting
} 3>&1 >&4 4>&- | { sleep 1; echo "$BASHPID: here"; } 4>&-
} 4>&1
echo "$BASHPID: there"
zsh
(그리고 명시적 으로녹음된)
zmodload zsh/system
{
do-something-interesting
} 3> >(sleep 1; echo $sysparams[pid]: here)
echo $sysparams[pid]: there
또한 작동하지만 ksh93
또는 에서는 작동하지 않습니다 bash
.