在 Bash 中,我偶尔会输入命令列表并点击Enter,后来才意识到列表末尾附近的某些命令有错误。我知道如果我按Ctrl+C它将终止当前正在运行的命令并取消列表的其余部分。有什么办法可以取消列表中的其余部分没有终止当前运行的命令?
例如,假设我输入了类似的内容
foo; bar
或者
foo && bar
其中foo
是一个长时间运行的命令,不要中断它非常重要,并且bar
会执行一些不可逆转的和不需要的操作(例如,shutdown -h now
或rm -rf /
)。当foo
仍在运行时,是否有一种通用方法告诉外壳程序让完成但之后foo
不运行? bar
(是的,我可以更改权限,bar
使其不可执行,但如果我想同时使用bar
类似的东西,那就不是特别方便,如果我不拥有或者是内置的,它也不会工作。)rm
bar
bar
答案1
我发现使用将CtrlZ程序转移到后台进程可以达到目的。
foo && bar
感谢@Arkadiusz Drabczyk 在评论中指出它foo; bar
并没有以所需的方式提供控制。
然后:
^Z
[1]+ Stopped foo
该命令仅停止第一个任务并且
fg %1
这只会将任务foo
带到前台并完成任务并退出。
PS:这可以通过写入文件的两个脚本来检查。第一个睡了几秒钟,以便有时间放回去。
我不明白为什么CtrlZ只处理正在运行的命令而忽略其余的命令。很想认识一下。