ほとんどのシェルは、&&
や;
などの関数を提供して、特定の方法でコマンドの実行をチェーンします。しかし、コマンドが既に実行されている場合でも、最初のコマンドの結果に応じて、実行する別のコマンドを追加することはできますか?
私が走ったと言う
$ /bin/myprog
some output...
本当に欲しかった/bin/myprog && /usr/bin/mycleanup
。時間がかかりすぎるため、myprog
を強制終了してすべてを再起動することはできません。できます Ctrl+Z それと、必要に応じてfg
/bg
これにより、別のコマンドでチェーンすることができますか?
私は主にbashに興味がありますが、すべての一般的なシェルに対する回答は大歓迎です!
wait
コマンドを使用して、同じシェルでこれを実行できるはずです。
$ sleep 30 &
[1] 17440
$ wait 17440 && echo hi
...30 seconds later...
[1]+ Done sleep 30
hi
Bash manページからの抜粋
wait [n ...]
Wait for each specified process and return its termination status. Each n
may be a process ID or a job specification; if a job spec is given, all
processes in that job's pipeline are waited for. If n is not given, all
currently active child processes are waited for, and the return status is
zero. If n specifies a non-existent process or job, the return status is
127. Otherwise, the return status is the exit status of the last process
or job waited for.
fg
は、再開したプログラムの終了コードを返します。したがって、プログラムを一時停止できます ^Zfg && ...
を使用して再開します。
$ /bin/myprog
some output...
^Z
[1]+ Stopped /bin/myprog
$ fg && /usr/bin/mycleanup
あなたが求めているものが可能かどうかはわかりませんが、プログラムを開始したシェルがまだある場合は、いつでも$?
最後のプロセスの終了ステータス:
$ /bin/myprog
some output...
$ if [ $? -ne 0 ];then echo "non-zero exit status";else echo "0 exit status";fi
ジョブがフォアグラウンドにある場合、これらのコマンドのどちらも期待どおりの動作になります。
[ $? -eq 0 ] && prog2
(( $? )) || prog2
注:$?終了時に実行中のプログラムの戻りステータスが含まれます。
これは、最初にコマンドを入力した場合のシェルの動作を明示的に示しています。
prog1 && prog2
最初のコマンドがstdin
から読み取っておらず、フォアグラウンドで実行されている場合、最初のコマンドの実行中に新しいコマンドを入力できます。シェルは、最初のコマンドが実行されると、それを読み取って実行します。コマンドがバックグラウンドで実行される場合、stdin
を読み取っていない可能性があります。
編集:ジョブをバックグラウンドで配置し、WAIT
コマンドを使用することもできます。他のジョブもバックグラウンドで実行されている場合、これは注意して行う必要があります。 WAIT
コマンドが待機中のジョブのステータスを返すには、ジョブの指定が必要です。