Bash 是否使用shell更新终端上显示的最后2行?

Bash 是否使用shell更新终端上显示的最后2行?,bash,shell,unix,Bash,Shell,Unix,我正在尝试构建一个简单的进度条脚本,它将显示一个进度条以及当前正在进行的操作 在echo-ne“[| |…]Processing${file_name}\r”的帮助下,我可以将进度条显示为: 处理文件1 但是,我希望输出如下所示: 处理文件1 [||||||……] 注意:这两行都是独立的行,我想在脚本运行时更新它们 有没有办法做到这一点?您可以使用tput cuu 2将光标向上移动两行,并使用tput el清除当前行: while sleep 1 do tput el; date

我正在尝试构建一个简单的进度条脚本,它将显示一个进度条以及当前正在进行的操作

echo-ne“[| |…]Processing${file_name}\r”
的帮助下,我可以将进度条显示为:

处理文件1

但是,我希望输出如下所示:

处理文件1

[||||||……]

注意:这两行都是独立的行,我想在脚本运行时更新它们


有没有办法做到这一点?

您可以使用
tput cuu 2
将光标向上移动两行,并使用
tput el
清除当前行:

while sleep 1
do
    tput el; date
    tput el; echo "$RANDOM"
    tput cuu 2
done
这将产生两条变化线,例如

Thu Jul 23 17:50:46 PDT 2015
23676  
由提供的解决方案假设两个字符的填充足以覆盖
$RANDOM
中的差异(一种从1到5位返回的功能)

这可以通过终端功能来适应,终端功能可以从光标位置清除到行的末尾。在这两种情况下,脚本都假设消息足够短,因此换行不是问题(OP的问题给出了一个具有这种可能性的示例):


这个解决方案很适合我的要求:-)你能建议如何删除和重印吗?因为当前的解决方案的问题是,如果它先打印
barrr
,然后再打印
foo
它会打印
foorr
#!/bin/bash
UP1="$(tput cuu 1)"
EL0="$(tput el)"
while sleep 1
do
    date
    printf '%s%s\r%s' "$RANDOM" "$EL0" "$UP1"
done