UNIX系統的命令很多,但是巧妙使用命令的方法更多。隨着經驗的積累和觀察學習其他用戶的實踐,我們也可學會解決特殊問題的方法。這里談談自己使用UNIX系統中stty命令的一些體會,希望能與你共享。
1.stty(settty,設置tty)命令用於檢查和修改當前注冊的終端的通信參數。UNIX系統為鍵盤的輸入和終端的輸出提供了重要的控制手段,可以通過stty命令對特定終端或通信線路設置選項。
可以在stty命令中使用-a查看當前注冊終端的設置情況。
$ stty -a
Speed 9600 baud; line =0;intr= DEL;quit = ^;erase = ^h;kill =^U;eof = ^d;start=^q;stop=^s
-parenb -parodd cs8 -cstopb -hupcl cread -clocal -loblk
-ignbrk brkint ignpar -parmrk -inpck istrip -inlcr -igncr icrnl-iuclc
ixon ixany -ixoff
isig icanon -xcase echo echoe echok -echonl -noflsh
opost -olcuc onlcr -ocrnl -onocr onlret ofill ofdel tab3
需要時,這里顯示的各種選擇都可以重新配置。每種終端選項都有自己的名字(如ixon),其中大多數要么被設置要么被清除。在stty中相應選項前冠以負號(-),該選項被清除(禁止);如果無負號,該選項被設置。
當希望修改各選擇的值時,應在stty命令中正確書寫相應選項。如命令
$ stty -ixon
將流控制設置為OFF,而命令
$ stty ixon
則將其置為ON。在stty命令中可以同時設置多個選項:
$ stty ixon 1200
該命令將終端設置為1200波特,並將流控制置為ON。
當選項的列表較長時,應當小心所做的修改造成會話的混亂。典型的情況下,終端在設置不正確時完全不能工作。經常出現的現象是列輸出顯示或用戶的擊鍵不能被shell正確接受。有時NEWLINE可能只顯示或走一行但不回行,即用戶輸入的NEWLINE符不能被shell正確讀取。建立新注冊標識的過程通常建立了正確的stty選項,在日常使用中很少需要修改。但如果變量TERM的設置不正確或用戶希望使用新的終端或通信渠道(如局域網),則需要修改stty的選項。如果你在某個機器中注冊后終端操作正常,但后來因故發生了混亂,那么最佳的解決方法是先注銷然后再向系統注冊。因為注冊時系統會重新設置相應選項。還有一種不太嚴格的解決辦法是:
$ stty sane
命令sane最常出現在大多數終端的stty選項的集合中。它並不改變通信信道的速率,但當終端發生混亂時,通常能夠產生有益的效果。命令sane可能使全屏幕應用程序(如vi)不能正確工作,而且在設置了選項sane之后,如果不能解決任何問題,就應立即注銷,然后再注冊。如果終端在注冊后依然不能正確工作,用戶的注冊可能是不成功的。如果終端已經混亂,NEWLINE鍵不能結束命令行,可以用CTRL-J代替NEWLINE直到用戶執行sttysane。此時,再用CTRL-J終止stty sane,使系統恢復正常。
stty命令的幾項主要選項功能為:
選項parenb使終端進行奇偶校驗,-parenb則是禁止校驗;
選項cs5、cs6、cs7和cs8分別將字符大小設為5、6、7和8比特;
選項300、600、1200、2400、4800、9600和19200設置波特率;
cstopb和-cstopb分別設置兩個或一個停止位;
tabs使系統使用制表符而不是空格序列,因此減少了輸出量,選項-tabs僅使用空格,當終端不能正確處理制表符(tab)時應使用該項。
2.stty還可用於控制一些具有特殊控制功能的鍵。系統可能已經使用CTRL-D作為文件結束符,但你可能喜歡使用CTRL-C。因此可以使用stty命令改變之:
$ stty eof c
其中c可以是你喜歡的其它特殊控制字符。
可以直接輸入控制字符,在其前面冠以反斜線和脫字符( ^)。命令
$ stty eof ^c
將CTRL-C設置為文件結束符。這種語法形式還可以用於修改刪除符(通常為退格鍵BackSpace)和中斷符(通常為DEL鍵)。若希望將刪除符改為BACKSPACE,可以使用下列命令:
$ stty erase ^h
可以設置一個會話期,使得當自己鍵入一個退格鍵時,系統用退格、刪除和退格序列響應。此時可以看到用退格鍵覆蓋的字符從顯示中消失了,這樣更符合計算機的慣例。使用命令
$ stty echoe
可使這一特性設置為ON。
終端方式及其管理是UNIX系統中比較困難的內容之一,系統的用戶手冊中有stty選項的全部清單。在進行嘗試之前,應當查閱手冊,仔細分析,以免給你的工作帶來麻煩。
stty - 改變並打印終端行設置
總覽
stty [-F device] [--file=device] [SETTING]...
stty [-F device] [--file=device] [-a|--all]
stty [-F device] [--file=device] [-g|--save]
描述
quot; Add any additional description here
打印或改變終端屬性.
-a, --all
以可讀的格式打印當前的所有設置
-g, --save
以終端可讀的格式打印當前的所有設置
-F, --file
打開指定的設備,並用此設備作為輸入來代替標准輸入
--help
顯示幫助並退出
--version
顯示版本信息並退出
選項-在SETTING之前使用這些選項將被視為無效 星號*表明是非POSIX設置.以下是一些系統定義了的
可用設置:
特殊字符
* dsusp CHAR CHAR表示輸入滿時,發一個停止信號給終端
eof CHAR
CHAR表示一個文件結束 (結束輸入)
eol CHAR
CHAR表示當前行結束
* eol2 CHAR CHAR是另一個表示結束當前行的字符
erase CHAR
CHAR表示擦除最后一個輸入字符
intr CHAR
CHAR表示發一個中斷信號
kill CHAR
CHAR表示擦除當前行
* lnext CHAR CHAR表示輸入下一個字符
quit CHAR
CHAR表示發出一個退出信號
* rprnt CHAR CHAR表示刷新當前行
start CHAR
CHAR表示在停止輸出后重新開始輸出
stop CHAR
CHAR表示停止輸出
susp CHAR
CHAR表示發送一個終端停止信號
* swtch CHAR CHAR表示切換到不同的外殼層
* werase CHAR CHAR表示擦除已經輸入的最后一個單詞
特殊設置
N
把輸入和輸出的波特率設為N
* cols N 通知內核終端有N列
* columns N 與cols N 相同
ispeed N
設置輸入速度為N
* line N 用行約束規則N
min N
用 -icanon, 設置一次完整的讀操作最小為N個字符
ospeed N
設置輸出速度為N
* rows N 通知內核終端有N行
* size 根據內核打印出終端的行數和列數
speed
打印出終端的速度
time N
同時用 -icanon, 設置讀超時為十分之N秒
控制設置
[-]clocal
關閉解調器的控制信號
[-]cread
允許接收輸入
* [-]crtscts 允許 RTS/CTS 的握手
csN
把字符長度設為N, N 為[5..8]
[-]cstopb
對每字符使用兩個停止位 (一個帶有 `-')
[-]hup
當最后一個進程關閉終端后,發一個掛起信號
[-]hupcl
同 [-]hup
[-]parenb
在輸出中產生奇偶校驗位,並要求在輸入中也有奇偶校驗位
[-]parodd
設置奇校驗 (偶校驗用 `-')
輸入設置:
[-]brkint
暫停並產生中斷信號
[-]icrnl
將回車解釋為換行
[-]ignbrk
忽略中斷信號
[-]igncr
忽略回車符
[-]ignpar
忽略有奇偶校驗錯的字符
* [-]imaxbel 對一個字符產生嘟叫,但不刷新已滿的輸入緩沖區
[-]inlcr
將換行解釋為回車
[-]inpck
打開輸入奇偶校驗
[-]istrip
清除輸入字符的高位(第8位)
* [-]iuclc 將大寫字符轉換成小寫字符
* [-]ixany 使任何字符都重新開始輸出(而 不僅僅是重新輸出字符能實現此功能)
[-]ixoff
打開發送開始/停止字符的開關
[-]ixon
打開XON/XOFF的流量控制
[-]parmrk
標記奇偶校驗錯誤 (使用255-0-character 字符序列)
[-]tandem
同 [-]ixoff
輸出設置:
* bsN 回退延遲, N 為 [0..1]
* crN 回車延遲, N 為 [0..3]
* ffN 換頁延遲, N 為 [0..1]
* nlN 換行延遲, N 為 [0..1]
* [-]ocrnl 將回車解釋為換行
* [-]ofdel 使用刪除字符來填充,而不是用空字符填充
* [-]ofill 使用填充字符,不使用定時延遲
* [-]olcuc 將小寫字符轉換成大寫
* [-]onlcr 將換行解釋為回車-換行
* [-]onlret 換行執行一次回車
* [-]onocr 不在第一列打印回車
[-]opost
postprocess 輸出
* tabN 水平tab鍵延遲, N 為 [0..3]
* tabs 同tab0
* -tabs 同tab3
* vtN 垂直方向tab鍵延遲。。。, N 為 [0..1]
本地設置:
[-]crterase
將擦除字符顯示為:退格-空格-退格
* crtkill 根據echoprt和echoe的設置去除所有行
* -crtkill 根據echoctl和echok設置去除所有行
* [-]ctlecho 在頭部符號中顯示控制字符'^c')
[-]echo
顯示輸入字符
* [-]echoctl 同 [-]ctlecho
[-]echoe
同[-]crterase
[-]echok
在一個殺死字符后顯示一個換行
* [-]echoke 同 [-]crtkill
[-]echonl
即使不顯示其它字符也換行
* [-]echoprt 向后顯示在 '' 和 '/'之間的擦除字符
[-]icanon
打開 erase, kill, werase, 和 rprnt 這些特殊字符
[-]iexten
打開 非POSIX 特殊字符
[-]isig
打開中斷,退出和掛起這些特殊字符
[-]noflsh
在中斷和退出這些特殊字符后禁止刷新
* [-]prterase 同 [-]echoprt
* [-]tostop 停止試圖寫終端的后台作業
* [-]xcase 與icanon同時使用, 表示用`'退出大寫狀態
綜合設置:
* [-]LCASE 同 [-]lcase
cbreak
同 -icanon
-cbreak
同 icanon
cooked
同 brkint ignpar istrip icrnl ixon opost isig icanon, eof 和 eol字符被設為默認值
-cooked
同 raw
crt
同 echoe echoctl echoke
dec
同 echoe echoctl echoke -ixany intr ^c erase 0177 kill ^u
* [-]decctlq 同 [-]ixany
ek
將擦除,殺死字符設為它們的默認值
evenp
同 parenb -parodd cs7
-evenp
同 -parenb cs8
* [-]lcase 同 xcase iuclc olcuc
litout
同 fB-parenb -istrip -opost cs8
-litout
同 parenb istrip opost cs7
nl
同 -icrnl -onlcr
-nl
同 icrnl -inlcr -igncr onlcr -ocrnl -onlret
oddp
同 parenb parodd cs7
-oddp
同 -parenb cs8
[-]parity
同 [-]evenp
pass8
同 -parenb -istrip cs8
-pass8
同 parenb istrip cs7
raw
同 -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr-icrnl -ixon -ixoff -iuc lc -ixany -imaxbel -opost -isig -icanon-xcase min 1 ti me 0
-raw
同 cooked
sane
同 cread -ignbrk brkint -inlcr -igncr icrnl -ixoff -iuclc -ixanyimaxbel opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0cr0 tab0 bs0 vt0 ff 0 isig icanon iexten echo echoe echok -echonl-noflsh -xcase -tostop -echoprt echoctl echoke, 所有特殊字符 使用缺省值.
本命令處理連接到標准輸入的終端行.如不帶參數,則輸出波特率, 行的約束規則,以及與健全 的stty相背離的設置.在設置中,CHAR 是逐字讀取的, 或是象 ^c, 0x37, 0177 或127這樣的 編碼; 特殊值 ^-或未定義被用來禁止特殊字符.
====