I/O 리디렉션을 위해 하위 프로세스를 기다리는 방법은 무엇입니까?

I/O 리디렉션을 위해 하위 프로세스를 기다리는 방법은 무엇입니까?

다음 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 &fgbgksh93bashzsh$!

표준적이고 이식 가능한 방법을 사용하여 이 작업을 수행할 수 있습니다.

{
  {
     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.

관련 정보