当任何现代 shell(如 Bash)据说都在原始模式下运行时,为什么不在其输出中stty -a
列出呢?raw
我知道任何现代 shell 都应该在原始模式下运行,即:
- 逐个字符地输入。
- 回显被禁用。
- 终端输入和输出的所有特殊处理均被禁用。
Readline 处理用户输入。
那么,为什么没有raw
在输出中列出呢stty -a
?
答案1
因为那个原始模式是一个近似值。没有官方定义原始模式实际上,对于不同的 API,它意味着不同的事情。
他们的意思是像bash
这样的 shell 实现自己的行编辑器禁用一些tty 线路规则的特征。特别是,他们需要禁用行规则自己的行编辑器(icanon
设置又名-cbreak
)和本地echo
。它们不会禁用其他一些线路规则功能,例如在^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 libccfmakeraw()
的至少与 GNU 的不同之处stty raw
在于,例如它禁用echo
并且不禁用iuclc
或ixoff
。