首先,您的问题与bash无关,而与终端无关。终端正在响应以显示程序的文本,一旦启动,bash本身就无法控制程序。
终端提供控制序列来控制颜色,字体,光标位置等。有关标准化终端序列的列表,请访问
http://www.termsys.demon.co.uk/vtansi.htm。例如
创建进度条。
更高级的终端转义序列通常取决于终端,例如仅与Eterm或xterm一起使用。诅咒是一个编程库,可以与终端创建交互式程序,因此您不必使用转义序列。
如何用终端序列覆盖现有行
echo long text
sleep 1
printf "\033[1A" # move cursor one line up
printf "\033[K" # delete till end of line
echo foo
如何在不使用终端顺序的情况下覆盖现有线路
一个简单的解决方案是不在末尾写换行符,而是写回车符,这基本上将光标重置到行首,例如:
echo -n first
sleep 1
echo -ne "\rsecond"
echo
的 \r
或回车就会把光标移动到该行的开头,并允许您覆盖该行的内容。
在缓冲区之间切换,例如less
或vi
的行为less
还归功于更高级的终端功能,即备用屏幕:
在VT102模式下,有一些转义序列可以激活和禁用备用屏幕缓冲区,该缓冲区的大小与窗口的显示区域相同。激活后,当前屏幕将保存并替换为备用屏幕。在恢复正常屏幕之前,将无法保存从窗口顶部滚动出来的行。xterm的termcap(5)条目允许可视编辑器vi(1)切换到备用屏幕进行编辑,并在退出时恢复该屏幕。弹出菜单条目使在剪切和粘贴的普通屏幕和备用屏幕之间切换变得简单。
http://rosettacode.org/wiki/Terminal_control/Preserve_screen列出了一些如何通过tput或一些转义序列自己完成操作的示例。