是否有命令让 bash 打印新的提示字符串并重画当前行?

Ari*_*ler 5 bash command-line ps1 cmd.exe

我不想等待缓慢的命令完成,而是想在后台运行它们。但是,当它们完成运行并打印到标准输出时,我得到(其中\xe2\x96\x88代表我的光标):

\n\n
$ slowcmd &\n$ cmd_output\n\xe2\x96\x88\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 我的光标之前没有提示字符串。
  • \n
  • 并且slowcmd可以是任何慢速命令(对于我尝试过的东西,我只是说alias slowcmd=\'sleep 1 && echo cmd_output\'
  • \n
\n\n

而我想要这样的东西:

\n\n
$ slowcmd && redrawPromptString &\n$ cmd_output\n$ \xe2\x96\x88\n
Run Code Online (Sandbox Code Playgroud)\n\n

在命令输出之后,会为我打印出一个新的提示字符串。

\n\n

我可以做些什么来实现redrawPromptString我想要的?我尝试过clearkill $$将 a 发送^C到终端,最后printf "^C"(当然这不起作用)。我正在运行 bash。(GNU bash,版本 3.2.57)。

\n

Kam*_*ski 2

使用内置redraw-current-line函数bind。首先检查它是否已经绑定:

bind -q redraw-current-line
Run Code Online (Sandbox Code Playgroud)

我从未见过它默认绑定,因此您可能需要绑定它。选择一个组合键,例如Ctrl+ Y。检查是否已经被占用:

bind -p | grep -F '"\C-y'
Run Code Online (Sandbox Code Playgroud)

空输出意味着该组合未使用。如果是这样,让我们​​绑定redraw-current-line它:

bind "\C-y":redraw-current-line
Run Code Online (Sandbox Code Playgroud)

现在,每当后台进程干扰您的命令行时,请按Ctrl+ Y。然后,您的提示将与您刚刚部分键入的任何命令(如果有)一起重新绘制,因此您可以继续操作,就像什么都没发生一样。

要使绑定永久化,您可以将上述命令添加到您的 中~/.bashrc,但不要这样做。正确的方法是修改~/.inputrc(针对用户)或/etc/inputrc(针对系统范围)。这样任何使用readline(3)库的程序都会遵守。添加到任一文件的行如下所示:

"\C-y":redraw-current-line
Run Code Online (Sandbox Code Playgroud)

但如果您~/.inputrc重新创建,请确保其第一行显示$include /etc/inputrc。这是因为到目前为止readline已经使用过/etc/inputrc,并且您的工作流程可能依赖于该文件中的内容。从现在开始,图书馆将使用您~/.inputrc的;该行$include /etc/inputrc也使其解析系统范围的文件。

有关详细信息,请参阅help bindman 3 readline