zshはジョブが完了するのを待ちます。

zshはジョブが完了するのを待ちます。

zshを実行している端末に次のように入力した場合(各行はコマンドです)

babel www/scripts6/lib/data.js > www/scripts/lib/data.js &
babel www/scripts6/lib/user.js > www/scripts/lib/user.js &
babel www/scripts6/lib/profile.js > www/scripts/lib/profile.js &
babel www/scripts6/lib/d3-and-svg.js > www/scripts/lib/d3-and-svg.js &
babel www/scripts6/main.js > www/scripts/main.js &
while [[ $(jobs) =~ 'babel' ]]; do echo 'moo'; done

約3秒間音が出て止まります。しかし、ファイルに同じコードを入れるとmoo.zshそれから私の端末で実行してください。

zsh moo.zsh

1秒もならない時間内に完了し、音が全く出ません。なぜこれが起こるのですか?

ベストアンサー1

非対話型シェルでは完全な操作制御はありません。jobsコマンドの置換を開始すると、サブシェルで実行されます。このサブシェルには実行中のジョブはなく、何もありません。

インタラクティブシェルではモニターが設定されました、タスクを完全に制御できます。この場合、zshサブシェルに入るとすべてのジョブが表に保管され、サブシェルにジョブがない場合はジョブ表が使用されます。

4.3以降では、zshshebang行を配置することで、非対話型シェルでジョブ制御を有効にできます。-m

#!/usr/bin/zsh -m

または以下を使用してくださいsetopt

setopt monitor
: The rest of script goes here

作業状態を確認するより良い方法は次のとおりです。

#!/usr/bin/zsh
zmodload zsh/parameter

babel www/scripts6/lib/data.js > www/scripts/lib/data.js &
babel www/scripts6/lib/user.js > www/scripts/lib/user.js &
babel www/scripts6/lib/profile.js > www/scripts/lib/profile.js &
babel www/scripts6/lib/d3-and-svg.js > www/scripts/lib/d3-and-svg.js &
babel www/scripts6/main.js > www/scripts/main.js &

while (( ${#jobstates} )); do
  print "moo"
done

とにかく、すべての子プロセスに対して組み込み待機を使用できます。待つ:

babel www/scripts6/lib/data.js > www/scripts/lib/data.js &
babel www/scripts6/lib/user.js > www/scripts/lib/user.js &
babel www/scripts6/lib/profile.js > www/scripts/lib/profile.js &
babel www/scripts6/lib/d3-and-svg.js > www/scripts/lib/d3-and-svg.js &
babel www/scripts6/main.js > www/scripts/main.js &
# Wait for all children
wait
echo END

おすすめ記事