$ command1 && command2 && command3
Running command1 ...
Running command2 ...^Z
[1]+ Stopped
$ fg && command4 && wrong_command5 && command6
Running command3
Running command4
現在の実行が終了した後にスケジュールをキャンセルするにはどうすればよいですかwrong_command5
?right_command5
command4
答え1
command4
現在実行している場合は、非常に簡単にこれを行うことができます。
^Z
$ fg && right_command5 && command6
これは本質的にcommand4
最初からあなたがやってきたことです。wrong_command5
残りは交換され、実行されません。
私はこの振る舞いが予期しないと仮定しているので、ここで何が起こっているのかを知るために読んでください。
しかし:注意してください元のコマンドの順序は、思ったように実行されませんでした。。これを行うとき:
$ command1 && command2 && command3
Running command1 ...
Running command2 ...^Z
[1]+ Stopped
$ fg && command4
これでcommand2
再開されます。しかし、チェーンの残りの部分はそうではありません。。停止は(-20)例外で終了することをcommand2
意味します。失敗したシャットダウンのため、チェーンが短絡して機能しません。終了後すぐに再開されます。Ctrl-ZSIGTSTP
command2
&&
command3
command4
command2
&&
以下を交換すると、この動作が実際に行われていることがわかります||
。
$ command2 || echo Running command3, exit was $?
^Z
[1]+ Stopped command2
Running command3, exit was 148
$
目標の動作を達成するには、回復時に後続のコマンドチェーン全体を一覧表示する必要があります。あるいは、コマンドチェーン全体を停止して再開できるようにするには、サブシェルでコマンドを実行する必要があります。
$ (command1 && command2 && command3)
^Z
$ fg
ただし、この場合、注文を調整して交換する方法はありません。
答え2
(これは文字の省略によって非常に異なる以前のバージョンの質問に対する答えです。2番目のコマンドはもともとfg && command4 & wrong_command5 && command6
あり、それが実際に何を意味するのかがわかりましたfg && command4 && wrong_command5 && command6
。これはバックグラウンドコマンドで以前の質問に対する答えです。新しいコマンドを参照してください。バリエーション(その他の回答)
キャンセルしたいコマンドはフォアグラウンドで実行されており、次のコマンドとも「接続」されています&&
。正常に実行され^C
、ゼロ以外の状態で終了すると、すべてが正常です。
例を簡単にするために、次の行を分割します。
$ fg && command4 & wrong_command5 && command6
等しい行に変更してください。
$ fg && command4 &
$ wrong_command5 && command6
前景プログラムを終了する必要があります。wrong_command5
これを使用して簡単に実行できます^C
。
次に、バックグラウンドタスクを一覧表示して、待ちたいタスクを確認します。ジョブIDは、wait
ジョブの終了を待つために組み込みコマンドと一緒に使用されます。置換コマンドを実行するためにリストの先頭として
使用し、その後に以前に使用してからコマンドを使用します。wait
$ command1 && command2 && command3
Running command1 ...
Running command2 ...^Z
[1]+ Stopped
$ fg && command4 &
$ wrong_command5 && command6
^C
$ jobs
[1] - running command3
[2] + running command4
$ wait %2 && right_command5 && command6
wrong_command5
キーボードから信号を受信すると正しく動作しませんが、他の信号では次のものを代わりに^C
使用できます。kill
^C
$ fg && command4 &
$ wrong_command5 && command6
[1] 14407
^Z
[2] + 14408 suspended wrong_command5
$ jobs
[1] - running command3
[2] + running command4
[3] suspended wrong_command5
$ kill %2
[2] + 14408 terminated wrong_command5
$ wait %2 && right_command5 && command6