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

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

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

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

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

Readline 处理用户输入。

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

答案1

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

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

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

stty还支持一些别名一次有多个设置,例如sane,cooked或...raw

stty raw禁用除 之外的所有 tty 线路规则功能echo。因此,它禁用了一些功能(例如isig),而这些功能bash不适用于其行编辑器,并且它不会禁用,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无效,这解释了为什么不费心关闭所有这些输出处理功能。opoststty raw

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

相关内容