예 (기능의 출처) 에서 bash
와 같이 ksh
프로세스 대체 내부 프로세스는 대기하지 않습니다 (스크립트에서 다음 명령을 실행하기 전에).
A의 <(...)
같이 미세 보통의 하나 :
cmd1 <(cmd2)
쉘은 대기한다 cmd1
과 cmd1
대기 전형적 것이다 cmd2
파일 끝 치환 된 파이프까지 읽고 그 덕분에, 그리고 그 파일의 끝은 전형적 때 발생하는 cmd2
다이. 그렇기 때문에 여러 쉘 (이 아닌 bash
)이에서 기다리지 않는 이유 cmd2
가 cmd2 | cmd1
있습니다.
들어 cmd1 >(cmd2)
는 더으로, 그러나, 즉, 일반적으로 그렇지 않다 cmd2
기다리는 일반적 cmd1
것이다 일반적으로 종료 후 너무가.
즉 고정 것 zsh
동안 그 대기 cmd2
가 (하지만 당신은 그것을 쓰기가 아닌 경우 cmd1 > >(cmd2)
와 cmd1
내장되지 않은 사용 {cmd1} > >(cmd2)
으로 대신 문서화 ).
ksh
기본적으로 기다리지 않지만 wait
내장 된 상태로 기다릴 수 있습니다 (pid를 사용할 수있게 만들지 $!
만 도움이되지는 않습니다 cmd1 >(cmd2) >(cmd3)
)
rc
를 사용하여 모든 백그라운드 프로세스의 pid를 얻을 수 있다는 점을 제외하고 는 cmd1 >{cmd2}
구문 ksh
과 함께 $apids
.
es
(와 함께 cmd1 >{cmd2}
)는 cmd2
in처럼 zsh
대기 cmd2
하고 <{cmd2}
프로세스 리디렉션 에서도 대기합니다 .
bash
에서 pid를 cmd2
(또는 cmd2
마지막 명령이더라도 해당 서브 쉘의 하위 프로세스에서 실행될 때보다 정확하게 서브 쉘을 $!
만들지 만 ) 기다릴 수는 없습니다.
를 사용해야 bash
하는 경우 두 명령을 모두 기다리는 명령을 사용하여 문제를 해결할 수 있습니다.
{ { cmd1 >(cmd2); } 3>&1 >&4 4>&- | cat; } 4>&1
즉 모두 제작 cmd1
및 cmd2
파이프 개방 자신의 FD (3)를 가지고있다. cat
, 파일의 마지막에 다른 쪽 끝에서 기다리는 너무 전형적 종료 할 때 둘 것 cmd1
와 cmd2
죽은. 그리고 쉘은 그 cat
명령 을 기다립니다 . 모든 백그라운드 프로세스의 종료를 포착하는 그물로 볼 수 있습니다 ( &
, coprocs 또는 백그라운드에서 시작된 다른 것들에 대해 사용할 수 있습니다. ).
위에서 언급 한 낭비 된 서브 쉘 프로세스 덕분에 cmd2
fd 3을 닫아도 작동합니다 (명령은 일반적으로 수행하지 않지만 일부는 비슷 sudo
하거나 ssh
수행합니다). 이후 버전의 버전은 bash
다른 쉘과 마찬가지로 최적화를 수행 할 수 있습니다. 그렇다면 다음과 같은 것이 필요합니다.
{ { cmd1 >(sudo cmd2; exit); } 3>&1 >&4 4>&- | cat; } 4>&1
해당 sudo
명령을 기다리는 fd 3 열린 상태로 추가 쉘 프로세스가 여전히 있는지 확인하십시오 .
주 cat
(프로세스가 자신의 FD 3에 기록하지 않기 때문에) 아무것도 읽지 않습니다. 동기화를위한 것입니다. read()
마지막에 아무것도 반환 하지 않는 하나의 시스템 호출 만 수행 합니다.
cat
파이프 대체를 수행하기 위해 대체 명령을 사용하여 실행 을 피할 수 있습니다 .
{ unused=$( { cmd1 >(cmd2); } 3>&1 >&4 4>&-); } 4>&1
이 시간, 그것은 쉘 대신의 cat
그 다른 쪽의 전략 중 3 열려있는 파이프에서 읽고 cmd1
와 cmd2
. 종료 상태 cmd1
는에서 사용할 수 있도록 변수 할당을 사용하고 있습니다 $?
.
또는 수동으로 프로세스 대체를 수행 한 다음 sh
표준 쉘 구문이되는 시스템을 사용할 수도 있습니다 .
{ cmd1 /dev/fd/3 3>&1 >&4 4>&- | cmd2 4>&-; } 4>&1
이전에 언급했듯이 모든 sh
구현 이 완료 된 cmd1
후에 기다릴 수 는 없습니다 cmd2
(반대보다 낫습니다). 그때, $?
종료 상태가 cmd2
; 하지만 bash
및 zsh
메이크업 cmd1
에서 사용할 수의 종료 상태 ${PIPESTATUS[0]}
와 $pipestatus[1]
각각 (또한 참조pipefail
있도록 몇 가지 껍질에 옵션을 $?
마지막 이외의 파이프 구성 요소의 실패를보고 할 수 있습니다)
참고 yash
자신의 프로세스와 유사한 문제가 리디렉션 기능을. 거기에 cmd1 >(cmd2)
쓰여질 cmd1 /dev/fd/3 3>(cmd2)
것입니다. 그러나 기다리지 cmd2
않고 wait
기다릴 수 없으며 $!
변수 에서 pid를 사용할 수 없습니다 . 에서와 동일한 해결 방법을 사용합니다 bash
.