シェルスクリプトで for ループの後ろのアンパサンド

シェルスクリプトで for ループの後ろのアンパサンド

端末で次のコマンドを実行することの違いは何ですか?

コマンド1

for i in {1..3}; do ./script.sh >& log.$i  & done

そして

コマンド2

for i in {1..3}; do ./script.sh >& log.$i  & done &

最初のコマンドを実行すると、画面に3つのジョブIDが表示され、端末に次のコマンドを入力できます。

2番目のコマンドは少し奇妙です。画面にジョブIDが表示されず、jobsコマンドを実行しても表示できません。仕事はどこに行きましたか?

script.shの内部には次のループがあります。

for k in 1; do
 ./tmp -arguments
done

echo "hello"

コマンド 1 を使用すると、実行可能ファイルが実行されているがまだ実行されていないように見えますhtop(./tmpログecho "hello"ファイルにはありません)。

htopコマンド2を使用すると、実行可能ファイルが実行./tmp中で実行されていることがわかりますecho "hello"(ログファイルに表示されます)。

&端末のコマンドがシェルスクリプト内のforループの動作を変更するのはなぜですか?

[GNU bash, バージョン 4.3.11(1)-リリース(x86_64-pc-linux-gnu)]

答え1

最初

for i in {1..3}; do
    ./script.sh >& log.$i  &
done

現在のシェルで実行します。ループが繰り返されるたびに、script.shスクリプトは現在のシェルのアクションとして実行されるため、そのように見えます。

第二

for i in {1..3}; do
    ./script.sh >& log.$i  &
done &

まず、ループを制御するサブシェルを起動します。次に、3回の繰り返しで3つのサブプロセスを作成します。それ現在のシェルでは、特定のタスクに分けられていないコマンド全体である1つのタスクのみが表示されます。 (この1つの職業を見なければなりません。走るまたは、次のように完璧.)

どちらの場合も、実行可能ファイルは./tmp同じ方法で実行する必要があります。echo "hello"実行済みとマークされた場合は、以前に./tmp完了したことを意味します。奇妙に動作する場合は、デバッグする必要があります(そして質問に詳細を追加する必要があります)。特に、どちらの場合も、呼び出し時に開始条件が同じであることを確認してください。例えば。既存のファイルを確認する場合は、どちらの場合も実際に存在するか、存在しないかなどを確認してください。

答え2

最後に「&」がある場合、コマンドはバックグラウンドで実行されます。これについての完全な説明については、このリンクをご覧ください。

バックグラウンドでBashコマンドを実行する

関連情報