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


10

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

例如,假设我输入了类似

foo; bar

要么

foo && bar

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


您可以在执行前将最后一个bar命令修改为some_command^bar^some_command
GAD3R

3
@ GAD3R:但这不会修改当前行,它将开始新的一行。
Arkadiusz Drabczyk

Answers:


3

我观察到,使用CtrlZ将程序转移到后台进程可以达到目的。

foo && bar

感谢@Arkadiusz Drabczyk在foo; bar无法以所需方式提供控制的注释中指出了它。

然后:

^Z

[1]+  Stopped                 foo

该命令仅停止第一个任务,然后

fg %1

这仅将任务foo带到前台,并完成任务并退出。

PS:可以使用两个写入文件的脚本来检查。第一个要睡几秒钟,以便腾出时间回去。

我迷失了为什么CtrlZ只处理正在运行的命令而剩下其余部分的原因。希望结识。


1
我无法复制。bash您使用什么版本?我用GNU bash, version 4.3.46(1)-release (x86_64-slackware-linux-gnu)。我写了2个bash脚本,分别写入不同的文件write1.sh::pastebin.com/rbKmdWgBwrite2.shpastebin.com/bNx3VRws。我这样运行它们:./write1.sh ; ./write2.shwrote 1我按C-z,第一个脚本回声了几次,它说[1]+ Stopped ./write1.sh,我可以立即看到第二个脚本的输出:wrote 2反复回声。
Arkadiusz Drabczyk '18

2
我认为此方法与command1 && command2管道一起使用的原因是Control-zSIGCHLD流程发送信号。可以用检查echo $?Bash然后看到第一个进程没有成功完成,并且不执行下一个进程。
Arkadiusz Drabczyk '18年

我正在使用GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)。是的,我认为您是对的。foo; bar无法以所需的方式进行控制。但是,Ctrl+Z如果命令运行为,我们可以停止第二个进程foo && bar。我将更新答案。感谢您指出。
Revanth Chetluru

@ArkadiuszDrabczyk没有Ctrl-Z发送SIGTSTP吗?
muru 18-4-3

@RevanthChetluru请注意,该文件bar仍处于暂停状态并显示在jobs输出中,因此也可能也应将其杀死。
muru 18-4-3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.