我将一长串命令粘贴到 Bash 中,在执行过程中,我决定希望它停止。 Ctrl+Z 和 Ctrl+C 没有执行任何操作。它只是继续一行一行地执行。最后,这些命令需要运行一个服务,所以我停止了该服务,而是使用另一个 SSH 实例,并且命令一个接一个地出错。
如果我无法停止服务来执行此操作,我将如何阻止列表继续执行?
答案1
这是一个答案为“那就不要这样做”的问题。
这是一个坏习惯,要尽量避免养成。如果你已经拥有它,请尝试打破它。否则就接受你所做的事情的后果。
将文本粘贴到 shell 中会用该文本填充输入缓冲区,就像您自己键入一样,并且在此之后您在缓冲区中键入的任何Ctrl-C击键Ctrl-Z或任何其他内容都不会被处理,直到您已经粘贴到缓冲区中的内容被消耗为止。它在队列中并且必须等待。
相反,请将命令粘贴到文本编辑器中,根据需要进行编辑,将其保存到文件中,然后执行脚本。
或者,如果由于某种原因您不想将脚本保存在临时文件中,请触发 shell 的命令行编辑器模式,将命令粘贴到编辑器中,进行编辑,然后保存并退出以执行这些命令。这实际上是避免将批量文本粘贴到 shell 中产生不良后果的一种方法。
在 中bash
,编辑器模式被调用edit-and-execute-command
并通过 调用Ctrl-XCtrl-E。它将尝试运行$VISUAL
、$EDITOR
、 或emacs
(按该顺序)来编辑当前输入行 - 因此它不仅对于复制粘贴有用,对于编辑历史记录中的行也很有用。其他一些 shell(例如zsh
)也有类似的功能。
答案2
我已经成功地使用 Ctrl+S 停止从 bash 到控制台的输出。这还有一个副作用,就是阻止进一步的命令执行。例如,我刚刚输入了这个
sleep 5; date; sleep 5; date
然后按 ENTER 键,然后我立即按 Ctrl-S。然后,我等了一分钟,按下 Ctrl-Q 并立即盲目地输入date
, 和 ENTER。
我想我能够判断 Ctrl-S 是否只停止了输出,并且date
提前了一分钟执行(我会得到两个非常接近的日期,第三个日期相隔一分钟),或者它是否至少停止了第二个date
,然后我会得到一个约会,然后在一分钟的暂停后两个非常接近的约会。
我得到了第二个,这证明 Ctrl-S 一旦有输出击中它就会停止:
$ sleep 5; date; sleep 5; date
Tue 07 Dec 2021 11:12:19 PM CET
date <--- this I typed after Ctrl-Q
Tue 07 Dec 2021 11:13:17 PM CET
$ date <--- this is my command echoed
Tue 07 Dec 2021 11:13:17 PM CET
$
但是,一旦 bash 停止,您仍然必须从不同的终端终止它。