すでに実行中のprog1に「&& prog2」を追加できますか?

すでに実行中のprog1に「&& prog2」を追加できますか?

&&;ほとんどのシェルは、任意の方法でコマンド実行を接続する機能を提供します。しかし、コマンドがすでに実行されている場合でも、最初のコマンドの結果に基づいて実行される他のコマンドを追加できますか?

逃げたと言った

$ /bin/myprog
some output...

しかし、私は本当にそれが欲しい/bin/myprog && /usr/bin/mycleanupmyprogあまりにも多くの時間が無駄になるため、すべてを終了して再開することはできません。私はそれをCtrl+することができ、/必要ならば 。これで他のコマンドをリンクできますか?Zfgbg

私はbashに最も興味がありますが、すべての一般的なシェルへの答えを歓迎します!

答え1

現在同じシェルで次のコマンドを使用してこれを実行できますwait

$ sleep 30 &
[1] 17440

$ wait 17440 && echo hi

...30 seconds later...
[1]+  Done                    sleep 30
hi

Bashのマニュアルページから

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.

答え2

fg再開されたプログラムの終了コードを返します。したがって、を使用してプログラムを一時停止してから、を^Z使用fg && ...して再起動できます。

$ /bin/myprog
some output...
^Z
[1]+ Stopped              /bin/myprog
$ fg && /usr/bin/mycleanup

答え3

要求された内容が可能かどうかはわかりませんが、プログラムを起動したシェルがまだある場合は、いつでも$?最後のプロセスの終了ステータスを確認できます。

$ /bin/myprog
some output...
$ if [ $? -ne 0 ];then echo "non-zero exit status";else echo "0 exit status";fi

答え4

ジョブがフォアグラウンドにある場合、これらのコマンドはすべて期待したのと同じ動作を持ちます。

[ $? -eq 0 ] && prog2
(( $? )) || prog2

注:$?には、実行中のプログラムが終了したときの戻り状態が含まれています。

これは、最初にコマンドを入力したときにシェルが実行するアクションを明示的に示します。

prog1 && prog2

最初のコマンドを読み取らずにstdinフォアグラウンドで実行している場合は、最初のコマンドの実行中に新しいコマンドを入力できます。最初のコマンドが実行されると、シェルはそれを読み取り実行します。コマンドがバックグラウンドで実行される場合stdin

編集:タスクをバックグラウンドに置き、コマンドを使用することもできますWAIT。バックグラウンドで他のタスクも実行している場合は注意が必要です。コマンドがWAIT待機しているジョブの状態を返すには、ジョブ仕様が必要です。

関連情報