我不想等待慢速命令完成,而是想在后台运行它们。但是,当它们完成运行并打印到 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)。^C
printf "^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 bind
和man 3 readline
。
答案2
如果您按下Ctrl+L
,它将部分地执行您想要的操作。它将重绘当前行,包括您在此点之前输入的所有内容,包括光标位置,但它将清除屏幕,因此您之前的输出将丢失(或者在回滚缓冲区中出现终端窗口的情况下)。另一方面,您愿意尝试clear
,所以也许这不是问题。