当任何现代 shell(如 Bash)据说都在原始模式下运行时,为什么“stty -a”不在其输出中列出“原始”?

Shu*_*eng 5 linux shell bash terminal

当任何现代 shell(如 Bash)据说都在原始模式下运行时,为什么不在其输出中stty -a列出呢?raw

我知道任何现代 shell 都应该在原始模式下运行,即:

  • 逐个字符地输入。
  • 回显被禁用。
  • 终端输入和输出的所有特殊处理均被禁用。

Readline 处理用户输入。

那么,为什么没有raw在输出中列出呢stty -a

Sté*_*las 5

因为原始模式有点近似。原始模式没有官方定义,实际上它对于不同的 API 意味着不同的事情。

他们的意思是,像这样的 shellbash实现自己的行编辑器会禁用tty 行规则的某些功能。特别是,他们需要禁用行规则自己的行编辑器(icanon设置又名-cbreak)和本地echo^C它们不会禁用其他一些线路规则功能,例如在(设置)时发送 SIGINT isig

stty -a报告各个离散 termios 设置(如上面的icanonechoisig)。

stty还支持一些别名来一次设置多个设置,例如sanecookedraw...。

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无效,这解释了为什么不费心关闭所有这些输出处理功能。opoststty raw

有些系统具有cfmakeraw()/ cfmakesane()libc 函数,也可以同时设置多个设置。GNU libccfmakeraw()的至少与 GNU 的不同之处在于stty raw,例如它禁用echo并且不禁用iuclcixoff