停止执行粘贴的多行命令

停止执行粘贴的多行命令

我将一长串命令粘贴到 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 停止,您仍然必须从不同的终端终止它。

相关内容