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

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

我不想等待慢速命令完成,而是想在后台运行它们。但是,当它们完成运行并打印到 stdout 时,我得到(其中代表我的光标)以下内容:

$ slowcmd &
$ cmd_output
  • 我的光标前没有提示字符串。
  • 并且slowcmd可以是任何慢速命令(对于我尝试过的东西,我只是说alias slowcmd='sleep 1 && echo cmd_output'

而我想要的是这样的:

$ slowcmd && redrawPromptString &
$ cmd_output
$ █

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

我该怎么做才能实现redrawPromptString我想要的效果?我尝试过clear,向终端kill $$发送,最后(当然没有用)。我正在运行 bash。(GNU bash,版本 3.2.57)。^Cprintf "^C"

答案1

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

bind -q redraw-current-line

我从未见过它默认绑定,所以你可能需要绑定它。选择一个组合键,比如说Ctrl+ Y。检查它是否已被使用:

bind -p | grep -F '"\C-y'

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

bind "\C-y":redraw-current-line

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

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

"\C-y":redraw-current-line

但是如果你新建~/.inputrc一个,请确保第一行写着$include /etc/inputrc。这是因为到目前为止readline已经使用了/etc/inputrc并且你的工作流程可能依赖于此文件中的内容。从现在开始,库将使用你的~/.inputrc;该行$include /etc/inputrc也使它解析系统范围的文件。

欲了解更多信息,请参阅help bindman 3 readline

答案2

如果您按下Ctrl+L,它将部分地执行您想要的操作。它将重绘当前行,包括您在此点之前输入的所有内容,包括光标位置,但它将清除屏幕,因此您之前的输出将丢失(或者在回滚缓冲区中出现终端窗口的情况下)。另一方面,您愿意尝试clear,所以也许这不是问题。

相关内容