実行中の `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

ただし、この場合、注文を調整して交換する方法はありません。

おすすめ記事