为什么`stty cols 40`在bash和xonsh这两个shell中效果不同

问题描述

在 Linux/macOS 上的 xonsh shell 中使用 stty 时出现奇怪的行为。 (命令似乎不遵守 xonsh 下定义的列,但它们在 bash 下这样做。)

为了更好地理解这种情况,我编写了一个小 C 程序,它为 3 个标准流 TIocgWINSZstdin、{{1} 调用 ioctlstdout }} 并打印出宽度。

在执行任何 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 ...

现在的问题是,如果所有都连接到相同终端,为什么在标准输入和标准输出(和标准错误)之间存在差异——这些设置应该是是每个终端,而不是每个文件描述符。我不知道。