在执行一个命令时将命令排队

UTF*_*F-8 8 command-line shell bash

假设您运行的命令需要一些时间才能返回,并希望在执行后执行不同的命令,但您没有提前计划。

我知道可以选择按Ctrl + Z然后提交fg && otherCommand。但是,这有两个主要缺陷:

  1. 如果第一个命令是不同命令(command1 && command2command1; command2)的组合,则它不起作用,因为第一个提交的行的后续命令不会被执行。
  2. 当您输入下一个命令时,第一个命令的执行将停止。对于那些令人讨厌的 30 秒命令,您输入下一个命令所花费的时间占剩余执行时间的很大一部分,如果不是全部的话。

我也知道你可以在执行一个命令时输入下一个命令,然后点击Enter它。但是,这也有两个主要缺陷:

  1. 如果您首先执行的命令从stdin.
  2. 如果您首先执行的命令产生输出,您将看不到您输入的内容。

在执行一个命令时,是否有一种快速的方法可以将更多命令排队,可能涉及使用特殊的终端仿真器或多个终端?

Gil*_*il' 5

Ctrl+Z并立即运行bg。这会导致当前命令继续在后台运行。然后您可以使用在当前时间之后fg && otherCommand进行安排。otherCommand

为了使这更容易,我在 shell 中配置了Ctrl+ ,当我在空命令行上按 + 时运行。请参阅在 zsh 中,我如何更快地否认前台进程?以及如何将命令行应用程序直接发送到后台?; 我还没有检查现代版本的 bash 是否可以轻松执行相同的操作。Zbg


Cal*_*ius 1

您可以创建一个命名管道(这需要完成一次):

mkfifo ~/myfifo
Run Code Online (Sandbox Code Playgroud)

然后从终端(我们称之为终端 A)你可以说:

exec 10< ~/myfifo
Run Code Online (Sandbox Code Playgroud)

要将管道的读取端分配给文件描述符 10,您可以使用 2 以上的任何其他数字(因此,如果另一个命令需要标准输入、输出和错误,则标准输入、输出和错误仍然可用)。

然后从另一个终端(我们称之为终端 B)你可以说:

cat - > ~/myfifo
Run Code Online (Sandbox Code Playgroud)

完成与终端 A 的连接,然后返回提示符。该命令将从标准输入输入的内容写入管道。然后您可以在终端 A 中输入以下内容:

while read -u10 -r LINE; do eval "$LINE"; done
Run Code Online (Sandbox Code Playgroud)

因此它将执行您在终端 B 中键入的命令。该read命令将从文件描述符 10 读取行并使用 执行它evaleval允许您运行 shell 命令,例如导出变量。

只要终端 A 打开,您就可以使用 Ctrl+C 中断循环,以便您可以再次输入命令,然后您可以重新启动循环以开始运行剩余的排队命令。

exec 和 while 命令可以放入 shell 脚本中,这样 fg && yourscript如果您一开始忘记了,可以使用 Ctrl-Z 来激活管道模式。