问题描述
在 Linux/macOS 上的 xonsh shell 中使用 stty
时出现奇怪的行为。 (命令似乎不遵守 xonsh 下定义的列,但它们在 bash 下这样做。)
为了更好地理解这种情况,我编写了一个小 C 程序,它为 3 个标准流 TIocgWINSZ
、stdin
、{{1} 调用 ioctl 和 stdout
}} 并打印出宽度。
在执行任何 stderr
命令之前,我会得到以下 ioctl 宽度的结果:
重击 | xonsh |
---|---|
stty |
stdin=80,stdout=80,stderr=80 |
到目前为止一切顺利。这意味着我的终端有 80 列宽。
现在我在每个 shell 中发出 stdin=80,stderr=80
,运行我的小程序并得到以下结果:
重击 | xonsh |
---|---|
stty cols 40 |
stdin=40,stdout=40,stderr=40 |
多么奇怪,在文件描述符 stdout 和 stderr 的 xonsh 下,报告的宽度为 80(!),而在 bash 下,所有描述符的宽度都为 40。
这让一些阐明了一个事实,即各种命令(例如 stdin=40,stderr=80
)不遵守 xonsh 下的 wget
调用。
但为什么会这样?我如何发出 stty col
样式的命令,在 xonsh 下将 所有 标准流的宽度设置为 40 ?
解决方法
默认情况下,stty 读取/设置 stdin 上的终端设置。您可以使用 -F
或 --file
参数设置其他终端
stty -F /dev/stdout ...
现在的问题是,如果所有都连接到相同终端,为什么在标准输入和标准输出(和标准错误)之间存在差异——这些设置应该是是每个终端,而不是每个文件描述符。我不知道。