如何更改終端上一行的內容而不是編寫一個新行?
因此,當
wget
獲取網頁時,它會向您顯示一個狀態欄,指示文件已下載多少。它看起來像這樣:
25%[=============>______________________________________] 25,000 100.0K/s
(下劃線是空格;我只是不知道如何在其中獲得多個連續的空格)但是,它不會向 stdout 寫入另一行並添加另一個進度條,而是對其進行更新,如下所示:
50%[===========================>________________________] 50,000 100.0K/s
這
wget
也不是唯一的例子。例如,當您將某些內容輸入less
然後退出時,您的原始提示仍然存在,以及您之前執行的任何命令的結果。就像你從未離開過一樣。所以,我的問題是,這叫什麼,我如何實現它,它一次只能用於一行,我可以在 C 中使用它嗎?
首先,您的問題與 bash 無關,而是與終端有關。終端響應顯示程序的文本,而 bash 本身一旦啟動就無法控製程序。
終端提供控制序列來控制顏色、字型、游標位置等。有關標準化終端序列的列表,請查看 http://www.termsys.demon.co.uk/vtansi.htm您可以例如
- 將游標定位在行首
- 之後刪除該行
- 寫一個新行
創建進度條。
更高級的終端轉義序列通常依賴於終端,例如僅適用於 Eterm 或 xterm。ncurses - 是一個程式庫,可以使用終端創建互動式程序,因此您不必使用轉義序列。
如何用終端序列覆蓋現有行
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還是通過一些轉義序列。