;
1行に2つのコマンドを接続するとき、Bashは2番目のコマンドを実行する前に最初のコマンドが終了するのを待つことを常に想定していますか?同様に、異なる行に2つの異なるコマンドを含むシェルスクリプトでは、Bashは2行目のコマンドを実行する前に常に1行目のコマンドが終了するのを待ちます。
この場合、最初のコマンドが完了するまで2番目のコマンドが待たないように、1行またはスクリプトで両方のコマンドを実行する方法はありますか?
また、シェルスクリプトの他の行は、またはでリンクされている;
別の行と同じですか&&
?
答え1
そうですね。スクリプトのコマンドはデフォルトで順次実行されます。
&
コマンドにサフィックス(シングルアンパサンド)を追加して、バックグラウンドでコマンドを実行できます。
別の行にあるコマンドは、デフォルトで;
使用される組み合わせコマンドと同じです。ゼロ以外の終了コード(set -e
)でシェルを停止するように指示すると、スクリプトはすべてのコマンドが一緒に実行されたかのように実行されます&&
。
答え2
2番目の質問に答えるには、&
バックグラウンドでコマンドを開始して完了するのを待たずにスクリプトを実行し続けます。
commandA & commandB
スクリプトではなく対話型端末でこのコマンドを実行すると、fg
それを使用してバックグラウンドコマンドに再焦点を合わせるか、バックグラウンドタスクのjobs
リストを表示できます。
答え3
最も簡単な場合、前のプロセスを完全に制御できる場合は、firstCommand && secondCommand
他の回答ですでに述べたコマンドに次のコマンドをリンクできます。この構文は、成功時に正しい終了コードを返し、失敗時にゼロ以外の値をfirstCommand
返す責任を持ち、正常に終了した場合にのみ実行されることを意味します。0
secondCommand
firstCommand
するときいいえfirstCommand
すでに実行中またはfirstCommand
成功/失敗時に通常の終了コードを返さないように制御するには、N秒ごとに実行中のプロセスをポーリングし、secondCommand
最初のプロセスが終了した後に開始できます。
while true ; do pgrep firstCommand && echo 'Still running...' || secondCommand ; sleep 1 ; done
❗️警告:0以外の終了状態で完了して
secondCommand
も実行されます。firstCommand
また見なさい:
答え4
他の人が言ったように、バックグラウンドで実行する必要があるコマンドの最後に&記号を追加する必要があります。
スクリプトがすべての操作を同時に完了して終了するようにするには、スクリプトの最後に「wait」コマンドを追加します。この場合、bashは実行を続行する前にすべてのコマンドが完了するのを待ちます。