考虑简单的脚本hello
:
#!/bin/bash
echo 'hello world!'
现在,如果我尝试在后台运行它,则从 bash 开始:
$ hello &
[1] 12345
$ hello world!
█ <--- prompt is stuck here until I hit enter!
[1]+ Done
$ █ <--- prompt back to normal
我更愿意看到的是:
$ hello &
[1] 12345
[1]+ hello world!
[1]+ Done
$ █ <--- prompt normal the whole time
我怎样才能改变这种行为?
答案1
这是时间问题:bashhello
在后台启动命令,然后显示提示让您输入新命令,然后后台命令打印一些输出。当您输入下一个命令行(空命令行,如果您只按Enter)时,bash 将显示后台作业已完成的通知,然后显示下一个提示。
您可能想要尝试一个以 开头的脚本sleep 3
,并在后台启动该脚本后立即开始输入,以查看以您可以遵循的速度发生的情况。
notify
您可以通过设置选项使 bash 在后台作业终止时立即通知您set -b
。然后你会看到:
$ set -b
$ hello &
[1] 12345
$ hello world!
[1]+ Done
在这种情况下,Bash 不会重新绘制提示。您仍在打印后台作业之前出现的提示行上编辑命令行hello world!
。您可以通过按Esc 1 Ctrl+重新绘制当前行L。您可能希望将命令绑定redraw-current-line
到更方便的键;例如,要Ctrl重新L绘制当前行并Ctrl清除屏幕,请将以下行添加到您Alt的:L~/.inputrc
"\C-l": redraw-current-line
"\e\C-l": clear-screen
我不知道有什么方法可以让 bash 自动重画提示行。 Zsh 默认执行此操作。