Debian

如何配置我的 tty 會話,以便換頁符 f 字元將清除終端?

  • June 29, 2021

我正在連接到 /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 --versiongive stty (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?)。

進一步閱讀:

引用自:https://unix.stackexchange.com/questions/74153