終端機的環境設定: 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:%s 07‘ dmtsai study ‘~‘ # 這個是在列出提示字元的控制碼! [dmtsai@study ~]$ echo ${HOME} + echo /home/dmtsai /home/dmtsai ++ printf ‘ 33]0;%s@%s:%s 07‘ 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的主要内容,如果未能解决你的问题,请参考以下文章