До версии 5.0.8, zsh
не мог ждать уже мертвых заданий. Это было изменено в версии 5.0.8 в 2014 году. См. изменение там.
Здесь вы можете просто перенаправить stderr в /dev/null
, чтобы игнорировать проблему:
wait $pid 2> /dev/null
Обратите внимание, что в:
{ tee $tmpdir/orig | arbitrary_pipeline > $tmpdir/alt; } &
качестве оптимизации, zsh
не будет форкать дополнительный процесс для arbitrary_pipeline
, он будет выполнять его в том же процессе, что и тот, который запускает подшелл, запущенный в фоне.
paste
не завершится до того, как увидит EOF на своем stdin, его stdin - это труба, на другом конце которой пишет $pid
(и его дети, если таковые имеются). Таким образом, он не увидит eof, пока $pid
(и его дети) не закроет все свои файловые дескрипторы (обычно только stdout) на пишущем конце трубы. Если только $pid
явно не закроет свой stdout (что бывает очень редко), это произойдет только при выходе.
Это означает, что paste
в большинстве случаев не завершится до $pid
, но на всякий случай все же стоит выполнить wait
.
Обратите внимание, что здесь можно использовать coproc
, чтобы избежать временных fifos:
coproc arbitrary_pipeline
cat >&p | paste - /dev/fd/3 3<&p &
coproc : close
wait
(обратите внимание, что wait
также ожидает coproc
s).