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

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

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

例如,假设我输入了类似的内容

foo; bar

或者

foo && bar

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

答案1

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

foo && bar

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

然后:

^Z

[1]+  Stopped                 foo

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

fg %1

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

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

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

相关内容