為什麼 stty -a
不在其輸出中列出 raw
,當任何現代 shell(如 Bash)據說以原始模式執行時?
當任何現代 shell(如 Bash)據說以原始模式執行時,為什麼不在其輸出
stty -a
中列出呢?raw
我知道任何現代外殼都應該在原始模式下執行,即:
- 輸入逐個字元可用。
- 迴聲被禁用。
- 終端輸入和輸出的所有特殊處理都被禁用。
Readline 處理使用者輸入。
那麼,為什麼沒有
raw
在輸出中列出stty -a
?
因為原始模式有點近似。原始模式沒有官方定義,實際上它對不同的 API 意味著不同的東西。
他們的意思是,像這樣的 shell
bash
實現了自己的行編輯器禁用了 tty 行規則的一些特性。特別是,他們需要禁用行學科自己的行編輯器(icanon
設置 aka-cbreak
)和 localecho
。他們不會禁用其他一些線路規則功能,例如在^C
(isig
設置)時發送 SIGINT。
stty -a
報告各個離散 termios 設置(如上面的icanon
,echo
,isig
)。
stty
還支持幾個別名一次設置多個設置,例如sane
,cooked
或*raw
*…。
stty raw
禁用所有 tty 線路規程功能,除了echo
. 因此,它禁用的某些功能(例如isig
)bash
不適用於其行編輯器,並且它不會禁用echo
而bash
不會禁用。GNU 實現的手冊
stty
描述raw
為等同於-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -icanon -opost -isig -iuclc -ixany -imaxbel -xcase min 1 time 0
. 那是一組termios
可以調整的離散設置stty raw
(不理會其他設置)。請注意,這
opost
不是stty
別名,它是它自己的離散 tty 行規則設置,但它會影響所有其他輸出後處理設置,如onlcr
,olcuc
. 或者換句話說,如果沒有打開onlcr
/olcuc
則無效opost
,這解釋了為什麼stty raw
不打擾關閉所有這些輸出處理功能。一些系統有
cfmakeraw()
/cfmakesane()
libc 函式,也可以一次設置多個設置。GNU libc的cfmakeraw()
至少與 GNU 的不同之stty raw
處在於它禁用echo
並且不禁用iuclc
或ixoff
.