저는 서브셸, 리디렉션 및 프로세스 대체를 사용하여 동일한 콘텐츠를 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