$ 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
将恢复,但链条的其余部分不会。停止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