Bash 프로세스가 서브쉘을 교체할 때까지 기다립니다.

Bash 프로세스가 서브쉘을 교체할 때까지 기다립니다.

저는 서브셸, 리디렉션 및 프로세스 대체를 사용하여 동일한 콘텐츠를 tee다음과 같은 여러 명령으로 파이프합니다.

#!/usr/bin/env bash

echo 'hello' | tee \
  >( sleep 3; cat /dev/stdin ) \
  >( sleep 2; cat /dev/stdin ) \
  >( sleep 1; cat /dev/stdin )

wait # Doesn't work :(

그러나 내가 본 것은 기본 스크립트가 종료된 후 프로세스 교체 하위 쉘 출력이 터미널에 기록되고 wait작동하지 않는다는 것입니다.

$ ./test.sh
hello
$ hello
hello
hello

프로세스가 서브쉘을 교체할 때까지 올바르게 기다리는 방법은 무엇입니까?

답변1

에서는 bash프로세스 교체를 기다릴 수 없습니다. 존재하다:

cmd1 > >(cmd2)

cmd1전체 명령은 상태에 관계없이 완료되는 즉시 완료됩니다 cmd2.

상위 프로세스에 완료 신호를 보내는 메커니즘을 구현해야 합니다 cmd2. fifo를 사용하는 간단한 방법은 다음과 같습니다.

#!/usr/bin/env bash

trap 'rm wait.fifo' EXIT
mkfifo wait.fifo

echo 'hello' | tee \
  >( sleep 3; cat /dev/stdin; : >wait.fifo ) \
  >( sleep 2; cat /dev/stdin; : >wait.fifo ) \
  >( sleep 1; cat /dev/stdin; : >wait.fifo )

for (( i=0;i<3;i++ )); do read <wait.fifo; done

관련 정보