清除 Terminal 的所有文字 (Clear terminal)



前言

  • 在測試 crystal-lang 的時候需要清空 terminal 的文字,剛好找到相關的方法 [1],順便紀錄。



說明

clear

  • 最基本的方式,就是下 clear 指令;但是這實際上沒有清空螢幕:滾輪往上滾還是看得到之前的記錄。
1
clear

如果想要完全清空文字呢?也就是連滑鼠滾輪往上滾都沒有東西?


clear 加上 ‘\e[3J’

  • 改良一下:
1
clear && printf '\e[3J'

這代表除了把螢幕清空,還順便把之前的記錄清除了。


Note

  • 大部分的 terminal 都認得這種 ANSI escape sequences [2],例如 vt100xterm。(不過我也不搞得很清楚各式各樣的 terminal 就是)

  • \eESC (escape),ASCII 中的第 27 碼。

  • 總之,形如 <ESC>[ 稱為 Control Sequence Introducer [3,4],代表要對 terminal 做額外的控制。

  • 而後面的 3 是參數、J 對應的是 ED (Erase Display) [3]

能不能再簡潔一點?


直接用 ‘\33c\e[3J’

  • 一行處理掉!
1
printf '\33c\e[3J'

Note

  • \33c33 是用 8 進位表示,也就是十進位的 27、 ASCII 編碼中的第 27 號,表示 ESC (escape),同上面的 NOTE。

  • <ESC>c (後面跟著一個 c),代表的是 reset device [7]

  • \e[3J 的說明參考上方


ESC (escape) 自由改寫

從上面的說明,大概會發現 <ESC> 有兩種寫法:

  • \33 (or \033)

  • \e

都是代表 <ESC>

所以上面的跳脫符號實際上你可以自由替換,只要符合 <ESC>c<ESC>[3J 即可

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
printf '\33c\e[3J'
printf '\33c\33[3J'
printf '\ec\e[3J'
printf '\ec\33[3J'

# \33 改成 \033
printf '\033c\e[3J'
printf '\033c\033[3J'
printf '\ec\e[3J'
printf '\ec\033[3J'



REF

  1. https://stackoverflow.com/questions/64396763/clear-terminal-console-in-crystal-cli

  2. https://en.wikipedia.org/wiki/ANSI_escape_code

  3. https://apple.stackexchange.com/questions/31872/how-do-i-reset-the-scrollback-in-the-terminal-via-a-shell-command/113168#113168

  4. https://invisible-island.net/xterm/ctlseqs/ctlseqs.html

  5. https://stackoverflow.com/questions/2198377/how-can-i-clear-previous-output-in-terminal-in-mac-os-x

  6. https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797

  7. https://stackoverflow.com/questions/47503734/what-does-printf-033c-mean

Licensed under CC BY-NC-SA 4.0
最後更新 2024-05-16 02:51

主題 StackJimmy 設計