&&
;
ほとんどのシェルは、任意の方法でコマンド実行を接続する機能を提供します。しかし、コマンドがすでに実行されている場合でも、最初のコマンドの結果に基づいて実行される他のコマンドを追加できますか?
逃げたと言った
$ /bin/myprog
some output...
しかし、私は本当にそれが欲しい/bin/myprog && /usr/bin/mycleanup
。myprog
あまりにも多くの時間が無駄になるため、すべてを終了して再開することはできません。私はそれをCtrl+することができ、/必要ならば 。これで他のコマンドをリンクできますか?Zfg
bg
私は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
待機しているジョブの状態を返すには、ジョブ仕様が必要です。