为什么 `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 程序,它调用 ioctl 和 TIOCGWINSZ
用于 3 个标准流 stdin
、stdout
、stderr
并打印出宽度。
在执行任何 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)之间存在差异,如果所有连接到 相同终端——设置应该是每个终端,而不是每个文件描述符。那个我不知道。
在 Linux/macOS 上的 xonsh shell 中使用 stty
时出现奇怪的行为。 (命令似乎不遵守 xonsh 下定义的列,但它们在 bash 下这样做。)
为了更好地了解情况,我编写了一个小 C 程序,它调用 ioctl 和 TIOCGWINSZ
用于 3 个标准流 stdin
、stdout
、stderr
并打印出宽度。
在执行任何 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)之间存在差异,如果所有连接到 相同终端——设置应该是每个终端,而不是每个文件描述符。那个我不知道。