Linux

為什麼 stty -a 不在其輸出中列出 raw,當任何現代 shell(如 Bash)據說以原始模式執行時?

  • August 26, 2019

當任何現代 shell(如 Bash)據說以原始模式執行時,為什麼不在其輸出stty -a中列出呢?raw

我知道任何現代外殼都應該在原始模式下執行,即:

  • 輸入逐個字元可用。
  • 迴聲被禁用。
  • 終端輸入和輸出的所有特殊處理都被禁用。

Readline 處理使用者輸入。

那麼,為什麼沒有raw在輸出中列出stty -a

因為原始模式有點近似。原始模式沒有官方定義,實際上它對不同的 API 意味著不同的東西。

他們的意思是,像這樣的 shellbash實現了自己的行編輯器禁用了 tty 行規則的一些特性。特別是,他們需要禁用行學科自己的行編輯器(icanon設置 aka -cbreak)和 local echo。他們不會禁用其他一些線路規則功能,例如在^Cisig設置)時發送 SIGINT。

stty -a報告各個離散 termios 設置(如上面的icanon, echo, isig)。

stty還支持幾個別名一次設置多個設置,例如sanecooked或*raw*…。

stty raw禁用所有 tty 線路規程功能,除了echo. 因此,它禁用的某些功能(例如isigbash不適用於其行編輯器,並且它不會禁用echobash不會禁用。

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並且不禁用iuclcixoff.

引用自:https://unix.stackexchange.com/questions/537296