如何取消/替换正在运行的 `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_command5调度?right_command5command4

答案1

如果command4当前正在运行,则可以非常简单地执行此操作:

^Z
$ fg && right_command5 && command6

这本质上就是您command4一开始就已经在做的事情。wrong_command5其余的将被替换并且永远不会执行。

我认为这种行为对您来说是出乎意料的,因此请继续阅读以了解哪些情况与您想象的不一样。


但是:请注意您原来的命令序列没有按照您的想法执行。当你这样做时:

$ command1 && command2 && command3
Running command1 ...
Running command2 ...^Z
[1]+  Stopped
$ fg && command4

然后command2将恢复,但链条的其余部分不会。停止command2为表示以(-20)Ctrl-Z异常退出。SIGTSTP由于command2退出不成功,&&会短路出链,command3永远不会运行。command4结束后会立即恢复command2

&&您可以通过将替换为 来观察此行为的实际效果||

$ command2 || echo Running command3, exit was $?
^Z
[1]+  Stopped                 command2
Running command3, exit was 148
$

如果您想要实现目标行为,则必须在恢复时列出整个后续命令链。或者,如果您希望能够停止和恢复整个命令链,您需要在子 shell 中运行它们:

$ (command1 && command2 && command3)
^Z
$ fg

但在这种情况下,根本无法调解和替换命令。

答案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获取 a 时表现不佳^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

相关内容