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