在没有劫持提示的情况下从后台进程中回显进度


10

考虑简单的脚本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

如何更改行为?

Answers:


13

这只是时间问题:bash hello在后台启动命令,然后显示提示让您输入新命令,然后后台命令打印一些输出。当您输入下一个命令行(空命令行,如果您只是按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默认情况下会这样做。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.