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

Why does `stty cols 40` have different effects in the two shells bash and xonsh

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

为了更好地了解情况,我编写了一个小 C 程序,它调用 ioctlTIOCGWINSZ 用于 3 个标准流 stdinstdoutstderr 并打印出宽度。

在执行任何 stty 命令之前,我得到以下 ioctl 宽度的结果:

bash xonsh
stdin=80, stdout=80, stderr=80 stdin=80, stdout=80, stderr=80

到目前为止一切顺利。这意味着我的终端有 80 列宽。

现在我在每个 shell stty cols 40、运行 我的小程序中发出并得到这些结果:

bash xonsh
stdin=40, stdout=40, stderr=40 stdin=40, stdout=80, stderr=80

多么奇怪,在 xonsh 下报告文件描述符 stdout 和 stderr 的宽度为 80(!) 而在 bash 下所有描述符都符合预期宽度为 40.

这揭示了 一些 事实,即各种命令(例如 wget)不服从 xonsh 下的 stty col 调用。

但为什么会这样? 我如何发出一个 stty 风格的命令,在 xonsh 下设置 all[ 的宽度=54=] 标准流到 40?

默认情况下,stty reads/sets stdin 上的终端设置。您可以使用 -F--file 参数

设置其他终端
stty -F /dev/stdout ...

现在的问题是,为什么 stdin 和 stdout(和 stderr)之间存在差异,如果所有连接到 相同终端——设置应该是每个终端,而不是每个文件描述符。那个我不知道。