![为什么 bash 不能遵循 stty 设置?](https://linux22.com/image/216323/%E4%B8%BA%E4%BB%80%E4%B9%88%20bash%20%E4%B8%8D%E8%83%BD%E9%81%B5%E5%BE%AA%20stty%20%E8%AE%BE%E7%BD%AE%EF%BC%9F.png)
从一个答案对于我之前的一个问题,我了解到 shell(例如 bash)有能力不遵循stty(1)
.特别是,它们可以在原始模式下运行,同时启用一个设置来打开规范模式 ( stty icanon
)(使用行规则编辑规则等)。
在这方面
- 每个正在运行的进程(进程组)都可以针对其终端配置自己的设置,这样说是否正确?换句话说,实例的设置不存在系统范围的点
tty
,它对于每个进程(进程组)都是单独的。 (因此 bash 在开始读取命令名称之前显式设置原始模式。) - 到底有什么
stty(1)
影响?我的猜测是这是一组用户偏好的实现终端模拟器相对于所使用的终端,它是 pty master 端。 - 当两侧通信时,从机上的 bash 和主机上的终端模拟器,它们设置了不同的 tty 配置(bash:“立即向我发送字符,无行编辑”,模拟器:“在 EOL 上发送字符,行编辑请”),为什么 bash 的规则会获胜?什么情况会影响这种优先权?
- 如果我们
cat
通过 bash 运行一些命令,它会遵守stty(1)
设置。那么这是否意味着 bash 在执行程序之前明确默认这些,或者它们cat
以其他方式“继承”?
答案1
任何进程都可以用来tcsetattr
更改终端驱动程序特性(请参阅 参考资料 中man -s 3 termios
完整的 608 行故事)。终端本身只保留它看到的最后状态——它不保留其他历史记录。
礼貌的用法是嵌套任何更改:任何更改它们的进程都应首先读取并保存当前集,仅更改它想要更改的那些,并在退出之前恢复其启动时的原始集(包括它所终止的任何终止的信号处理程序)能)。
从一次一行(规范输入)到单字符的切换是 termios 结构的 c_lflag 成员中的一位更改,并且所需的位掩码有一个 ICANON 定义。同样,ECHO 与否也是一位翻转。