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

関連情報