zoukankan      html  css  js  c++  java
  • 終端機的環境設定: 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 『暫停』目前的命令

  • 相关阅读:
    洛谷 P2008 大朋友的数字
    [USACO10FEB]慢下来Slowing down
    HAOI2007 理想的正方形 单调队列
    滑动窗口
    双栈排序
    概率无向图模型与条件随机场的异同
    P-R曲线出现凹陷的原因
    MaskLab-实例分割(使用语义分割和方向特征精细化目标检测)
    模拟递归生成器
    递归生成器
  • 原文地址:https://www.cnblogs.com/taosiyu/p/13095202.html
Copyright © 2011-2022 走看看