如何配置我的 tty 會話,以便換頁符 f
字元將清除終端?
我正在連接到 /dev/ttyACM0 上的 USB 串列連接。
\f
發送方的程式碼定期發送一個字元。print("----------------------------\n\r"); print("-- LED CONTROLLER 00.01 --\n\r"); print("----------------------------\n\r"); print("\n\f");
但是,當我
cat /dev/ttyACM0
從控制台執行時,輸出會向下滾動我的螢幕,而不是在頂部刷新。我已經探勘了目前
stty
設置(通過鍵入stty -F /dev/ttyACM0 -a
),它給出了以下輸出:speed 115200 baud; rows 0; columns 0; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^A; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8 -opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke
閱讀
stty --help
頁面會導致換頁延遲 (ff0
),但不指示如何更改其他任何內容。我還發現這個頁面表明我可以像這樣設置 FormFeed 字元FormFeed=014
,但是該語法不適用於我的 stty 版本(stty --version
givestty (GNU coreutils) 8.5
)。Windows 中的 Putty 表現出正確的行為,但我正在努力讓它在 Debian 6 中工作。有誰知道我如何配置 stty 以將換頁解釋為終端清除?
您需要
\f
用正確的ANSI 轉義碼替換換頁符 () 。你可以用GNU sed做到這一點:
sed 's/\f/\o33[2J\o33[0;0H/g' /dev/ttyACM0
詳細:
\033[2J
清除螢幕,\033[0;0H
:轉到位置 0,0(如果這不起作用,請嘗試
tail -f /dev/ttyACM0 | sed 's/\f/\o33[2J\o33[0;0H/g'
)編輯:正如@MarkReel 評論的那樣,您可以使用非 GNU sed 版本(例如 BSD sed)ANSI 轉義字元串:
sed $'s/\f/\e[2J\e[0;0H/g' /dev/ttyACM0
GNU sed 不是解決這個問題所必需的(儘管腳本更容易閱讀)。一個最小的腳本是(用 Solaris 和 OSX 測試):
sed -e 's/^L/^[[H^[[J/g'
其中
^L
和^[
是換頁control``L
和轉義的文字控製字元control``[
。您可以使用vi
(用於插入轉義字元,第一種類型control``V
)將它們插入文件中。轉義序列用於
- 將游標移動到起始位置
^[[H
並- 清除顯示
^[[J
幾點注意事項:
- 沒有必要在轉義中給出行和列(在任何情況下,位置都以1
^[[H
開頭,而不是0),並且- 如果在移動游標之前
2
清除了螢幕,則在轉義中需要 a,例如,^[[2J
因為這會清除整個顯示。預設^[[J
從目前位置清除到顯示結束。例如,一些非標準終端ansi.sys
沒有做出這種區分。有些人對 bash 使用
^L
鍵盤快捷鍵清除螢幕以及 PuTTY 的解釋感到困惑^L
(請參閱XTerm FAQ 中的Why does not the screen clear when I type control/L?)。進一步閱讀: