実行中の `cmd1 && cmd2 && cmd3 && ...` チェーンの要素をキャンセル/交換するには?

実行中の `cmd1 && cmd2 && cmd3 && ...` チェーンの要素をキャンセル/交換するには?
$ command1 && command2 && command3
Running command1 ...
Running command2 ...^Z
[1]+  Stopped
$ fg && command4 && wrong_command5 && command6
Running command3
Running command4

現在の実行が終了した後にスケジュールをキャンセルするにはどうすればよいですかwrong_command5right_command5command4

答え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-ZSIGTSTPcommand2&&command3command4command2

&&以下を交換すると、この動作が実際に行われていることがわかります||

$ 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

関連情報