如何取消 Bash 中的其余命令列表?

Psy*_*aut 10 command-line bash job-control

在 Bash 中,偶尔我会输入一个命令列表并点击Enter,然后才意识到列表末尾附近的某个命令有错误。我知道如果我按Ctrl+C它将终止当前正在运行的命令并取消列表的其余部分。有没有办法在终止当前运行的命令的情况下取消列表的其余部分?

例如,假设我输入了类似

foo; bar
Run Code Online (Sandbox Code Playgroud)

或者

foo && bar
Run Code Online (Sandbox Code Playgroud)

wherefoo是一个长时间运行的命令,不要中断非常重要,并且会bar执行一些不可逆和不需要的操作(例如,shutdown -h nowrm -rf /)。在foo仍在运行时,是否有一种通用的方法可以告诉外壳让foo完成但bar之后不运行?(是的,我可以更改权限bar,使其不可执行,但如果我想同时使用bar类似的东西,这不是特别方便rm,如果我不拥有bar或者bar是内置的,它也不会工作。)

小智 5

我发现使用CtrlZ将程序转移到后台进程可以达到目的。

foo && bar
Run Code Online (Sandbox Code Playgroud)

感谢 @Arkadiusz Drabczyk 在评论中指出它并foo; bar没有以所需的方式提供控制。

然后:

^Z

[1]+  Stopped                 foo
Run Code Online (Sandbox Code Playgroud)

该命令仅停止第一个任务并且

fg %1
Run Code Online (Sandbox Code Playgroud)

这只会将任务foo带到前台并完成任务并退出。

PS:这可以通过写入文件的两个脚本来检查。第一个睡了几秒钟,以便有时间放回去。

我不明白为什么CtrlZ只处理正在运行的命令而忽略其余的命令。很想认识一下。

  • 我认为此方法与“command1 && command2”管道一起使用的原因是“Control-z”向进程发送“SIGCHLD”信号。可以用“echo $?”来检查。然后,“Bash”发现第一个进程未成功完成,并且不会执行下一个进程。 (2认同)