終端機的環境設定: stty, set

Posted taosiyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了終端機的環境設定: stty, set相关的知识,希望对你有一定的参考价值。

終端機的環境設定: stty, set

在 tty1 ~ tty6 這六個文字介面的終端機 (terminal) 環境中登入,登入的時候我們可以取得一些字元設定的功能! 舉例來說,我們可以利用倒退鍵 (backspace,就是那個←符號的按鍵) 來刪除命令列上的字元, 也可以使用 [ctrl]+c 來強制終止一個指令的運行,當輸入錯誤時,就會有聲音跑出來警告。這是怎麼辦到的呢? 很簡單啊!因為登入終端機的時候,會自動的取得一些終端機的輸入環境的設定啊!

事實上,目前我們使用的 Linux distributions 都幫我們作了最棒的使用者環境了, 所以大家可以不用擔心操作環境的問題。不過,在某些 Unix like 的機器中,還是可能需要動用一些手腳, 才能夠讓我們的輸入比較快樂~舉例來說,利用 [backspace] 刪除,要比利用 [Del] 按鍵來的順手吧! 但是某些 Unix 偏偏是以 [del] 來進行字元的刪除啊!所以,這個時候就可以動動手腳囉~

那麼如何查閱目前的一些按鍵內容呢?可以利用 stty (setting tty 終端機的意思) 呢! stty 也可以幫助設定終端機的輸入按鍵代表意義喔!

[dmtsai@study ~]$ stty [-a]
選項與參數:
-a  :將目前所有的 stty 參數列出來;

範例一:列出所有的按鍵與按鍵內容
[dmtsai@study ~]$ stty -a
speed 38400 baud; rows 20; columns 90; line = 0;
intr = ^C; quit = ^; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0;
....(以下省略)....

我們可以利用 stty -a 來列出目前環境中所有的按鍵列表,在上頭的列表當中,需要注意的是特殊字體那幾個, 此外,如果出現 ^ 表示 [Ctrl] 那個按鍵的意思。舉例來說, intr = ^C 表示利用 [ctrl] + c 來達成的。幾個重要的代表意義是:

  • intr  : 送出一個 interrupt (中斷) 的訊號給目前正在 run 的程序 (就是終止囉!);
  • quit  : 送出一個 quit 的訊號給目前正在 run 的程序;
  • erase : 向後刪除字元,
  • kill  : 刪除在目前指令列上的所有文字;
  • eof   : End of file 的意思,代表『結束輸入』。
  • start : 在某個程序停止後,重新啟動他的 output
  • stop  : 停止目前螢幕的輸出;
  • susp  : 送出一個 terminal stop 的訊號給正在 run 的程序。

記不記得我們在第四章講過幾個 Linux 熱鍵啊?沒錯! 就是這個 stty 設定值內的 intr([ctrl]+c) / eof([ctrl]+d) 囉~至於刪除字元,就是 erase 那個設定值啦! 如果你想要用 [ctrl]+h 來進行字元的刪除,那麼可以下達:

[dmtsai@study ~]$ stty erase ^h  # 這個設定看看就好,不必真的實做!不然還要改回來!

那麼從此之後,你的刪除字元就得要使用 [ctrl]+h 囉,按下 [backspace] 則會出現 ^? 字樣呢! 如果想要回復利用 [backspace] ,就下達 stty erase ^? 即可啊! 至於更多的 stty 說明,記得參考一下 man stty 的內容喔!

問:
因為鳥哥的工作經常在 Windows/Linux 之間切換,在 windows 底下,很多軟體預設的儲存快捷按鈕是 [ctrl]+s ,所以鳥哥習慣按這個按鈕來處理。 不過,在 Linux 底下使用 vim 時,卻也經常不小心就按下 [ctrl]+s !問題來了,按下這個組合鈕之後,整個 vim 就不能動了 (整個畫面鎖死)! 請問鳥哥該如何處置?
答:
參考一下 stty -a 的輸出中,有個 stop 的項目就是按下 [ctrl]+s 的!那麼恢復成 start 就是 [ctrl]+q 啊!因此, 嘗試按下 [ctrl]+q 應該就可以讓整個畫面重新恢復正常咯!

除了 stty 之外,其實我們的 bash 還有自己的一些終端機設定值呢!那就是利用 set 來設定的! 我們之前提到一些變數時,可以利用 set 來顯示,除此之外,其實 set 還可以幫我們設定整個指令輸出/輸入的環境。 例如記錄歷史命令、顯示錯誤內容等等。

[dmtsai@study ~]$ set [-uvCHhmBx]
選項與參數:
-u  :預設不啟用。若啟用後,當使用未設定變數時,會顯示錯誤訊息;
-v  :預設不啟用。若啟用後,在訊息被輸出前,會先顯示訊息的原始內容;
-x  :預設不啟用。若啟用後,在指令被執行前,會顯示指令內容(前面有 ++ 符號)
-h  :預設啟用。與歷史命令有關;
-H  :預設啟用。與歷史命令有關;
-m  :預設啟用。與工作管理有關;
-B  :預設啟用。與刮號 [] 的作用有關;
-C  :預設不啟用。若使用 > 等,則若檔案存在時,該檔案不會被覆蓋。

範例一:顯示目前所有的 set 設定值
[dmtsai@study ~]$ echo $-
himBH
# 那個 $- 變數內容就是 set 的所有設定啦! bash 預設是 himBH 喔!

範例二:設定 "若使用未定義變數時,則顯示錯誤訊息" 
[dmtsai@study ~]$ set -u
[dmtsai@study ~]$ echo $vbirding
-bash: vbirding: unbound variable
# 預設情況下,未設定/未宣告 的變數都會是『空的』,不過,若設定 -u 參數,
# 那麼當使用未設定的變數時,就會有問題啦!很多的 shell 都預設啟用 -u 參數。
# 若要取消這個參數,輸入 set +u 即可!

範例三:執行前,顯示該指令內容。
[dmtsai@study ~]$ set -x
++ printf ‘33]0;%s@%s:%s07‘ dmtsai study ‘~‘    # 這個是在列出提示字元的控制碼!
[dmtsai@study ~]$ echo ${HOME}
+ echo /home/dmtsai
/home/dmtsai
++ printf ‘33]0;%s@%s:%s07‘ dmtsai study ‘~‘
# 看見否?要輸出的指令都會先被列印到螢幕上喔!前面會多出 + 的符號!

另外,其實我們還有其他的按鍵設定功能呢!就是在前一小節提到的 /etc/inputrc 這個檔案裡面設定。 還有例如 /etc/DIR_COLORS* 與 /usr/share/terminfo/* 等,也都是與終端機有關的環境設定檔案呢! 不過,事實上,鳥哥並不建議您修改 tty 的環境呢,這是因為 bash 的環境已經設定的很親和了, 我們不需要額外的設定或者修改,否則反而會產生一些困擾。不過,寫在這裡的資料, 只是希望大家能夠清楚的知道我們的終端機是如何進行設定的喔! ^_^! 最後,我們將 bash 預設的組合鍵給他彙整如下:

組合按鍵 執行結果
Ctrl + C 終止目前的命令
Ctrl + D 輸入結束 (EOF),例如郵件結束的時候;
Ctrl + M 就是 Enter 啦!
Ctrl + S 暫停螢幕的輸出
Ctrl + Q 恢復螢幕的輸出
Ctrl + U 在提示字元下,將整列命令刪除
Ctrl + Z 『暫停』目前的命令

以上是关于終端機的環境設定: stty, set的主要内容,如果未能解决你的问题,请参考以下文章

设置jetson nano VNC

免安裝免設定的 Hadoop 開發環境 - cloudera 的 QuickStart VM

Java學習筆記(基本語法)

stty(set tty)

在Xcode開發python

初识java ---我的第一个java程序