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

时间:2015-07-23 23:59:49

标签: bash shell unix

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

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

  

[|||||||| ............]处理文件1

但是我期待这样的输出:

  

处理file1

     

[|||||||| ............]

注意:两者都是单独的行,我想更新它们作为我的脚本进度。

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:4)

您可以使用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  

答案 1 :(得分:1)

@that other guy提供的解决方案假设2个字符的填充足以涵盖$RANDOMnonstandard bash-specific功能的差异,该功能从1返回到5位数。)

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

#!/bin/bash
UP1="$(tput cuu 1)"
EL0="$(tput el)"
while sleep 1
do
    date
    printf '%s%s\r%s' "$RANDOM" "$EL0" "$UP1"
done