UTF*_*F-8 8 command-line shell bash
假设您运行的命令需要一些时间才能返回,并希望在执行后执行不同的命令,但您没有提前计划。
我知道可以选择按Ctrl + Z然后提交fg && otherCommand。但是,这有两个主要缺陷:
command1 && command2或command1; command2)的组合,则它不起作用,因为第一个提交的行的后续命令不会被执行。我也知道你可以在执行一个命令时输入下一个命令,然后点击Enter它。但是,这也有两个主要缺陷:
stdin.在执行一个命令时,是否有一种快速的方法可以将更多命令排队,可能涉及使用特殊的终端仿真器或多个终端?
按Ctrl+Z并立即运行bg。这会导致当前命令继续在后台运行。然后您可以使用在当前时间之后fg && otherCommand进行安排。otherCommand
为了使这更容易,我在 shell 中配置了Ctrl+ ,当我在空命令行上按 + 时运行。请参阅在 zsh 中,我如何更快地否认前台进程?以及如何将命令行应用程序直接发送到后台?; 我还没有检查现代版本的 bash 是否可以轻松执行相同的操作。Zbg
您可以创建一个命名管道(这需要完成一次):
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 读取行并使用 执行它eval。eval允许您运行 shell 命令,例如导出变量。
只要终端 A 打开,您就可以使用 Ctrl+C 中断循环,以便您可以再次输入命令,然后您可以重新启动循环以开始运行剩余的排队命令。
exec 和 while 命令可以放入 shell 脚本中,这样 fg && yourscript如果您一开始忘记了,可以使用 Ctrl-Z 来激活管道模式。
| 归档时间: |
|
| 查看次数: |
5933 次 |
| 最近记录: |