command1 ; command2
のようなもの、つまりcommand2
の後にcommand1
を実行する方法を探していますが、command2
がすでに実行されているときにcommand1
の実行を計画したい。
command2
は標準入力を消費しておらず、command1
は出力時に多くのテキストを生成しないため、command1
を入力してEnterで確認するだけで解決できます。入力します(入力した文字はcommand1
出力とブレンドされます)。
一般的に私がすることは:Ctrl+Zfg && command2
bg
。command2を入力している間、command1をバックグラウンドで再開します。fg && command2
command1をフォアグラウンドで再開し、command1が成功した場合は後でcommand2をキューに入れます。もちろん;
または||
のために &&
希望する場合。コマンドを開始する
command1
を押して実行を一時停止します Ctrl+Z
次のコマンドを実行して、一時停止されたコマンドのジョブ番号を確認します(通常、コマンドが一時停止されたときにコンソールに出力されます)。
jobs
バックグラウンドでcommand1
を続行します
bg
command2
の終了を待つcommand1
の実行を計画する
wait -n <command1 job number> ; command2
ドキュメント Job Control Builtins
いくつかの選択肢があります。
アンパサンドが1つ、「バックグラウンドにプッシュ」、2番目のプログラムは最初のプログラムの開始後に開始されますが、おそらく互いに並行して実行されます。
command1 & command2
2つのアンパサンドを使用、 'logical and'、2番目のプログラムは、最初のプログラムが正常に終了した場合にのみ開始されます。
command1 && command2
セミコロン付きコマンドラインでコマンドを区切ると、2番目のプログラムは、最初のプログラムが失敗または中断した場合でも、終了すると開始します。
command1 ; command2
wait <PID>
最初のコマンドが同じシェル(同じターミナルウィンドウ内)から既に実行されている場合は、最初のコマンドが完了するまで待機します。
それ以外の場合、最初のコマンドが別のシェルから(別のウィンドウで)すでに実行されている場合は、小さなpsを使用したwhileループを使用して、PIDがps
)によってまだ検出されているかどうかを確認できます。見つからない場合は、2番目のコマンドが開始されます。
このbash
のデモ例は、top
がPIDを介して実行されているかどうかを確認し、コマンドを実行します
echo "*** $USER, I am ready now ***"
if/when top
が実行されていない。
pid=$(ps -A|grep top|cut -d ' ' -f 1); \
while [ "$pid" != "" ]; do ps -A|grep "$pid" > /dev/null; \
if [ $? -eq 0 ]; then sleep 5;else pid=""; fi; done; \
echo "*** $USER, I am ready now ***"
標準的な方法は、コマンド1をバックグラウンドで開始し、コマンド2をバックグラウンドまたはフォアグラウンドで開始させることです。完全なコマンドは次のとおりです。
command1 & command2
&
は、これら2つのコマンド間のコネクタではありません。 command1
を単独で使用して、バックグラウンドで開始することができます。
command1 &
そして、これはバックグラウンドで両方のコマンドを開始するための正しい構文です:
command1 & command2 &