次の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 &
fg
bg
ksh93
bash
zsh
$!
標準的で移植可能な方法を使用してこれを実行できます。
{
{
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
。