0

我对tput终端大小之间的交互有点困惑。似乎 的行为tput取决于调用它的外壳程序,或者外壳程序可能负责更改终端设置,或者....某些东西。为了减少问题,请考虑:

dash$ exec bash
bash$ trap 'echo winched' WINCH
bash$ tput cols
176
bash$ # changing terminal size now (after hitting return)
bash$ winched
bash$ winched
tput cols
150
bash$ exec dash
dash$ trap 'echo winched' WINCH
dash$ tput cols
150
dash$ # changing terminal size now (after hitting return)
dash$ tput cols
winched
150

在这里,在 bash 中,事情的行为(几乎)符合预期(我说几乎,因为我不太确定 WINCH 处理程序为什么执行两次),并且tput更改的输出与新的终端大小相匹配。但是,当在 dash 中运行时,tput即使终端改变了大小,输出也不会改变。另请注意,WINCH 处理程序似乎被破折号延迟,并且直到输入下一个命令之后(但在它执行之前)才执行。这里应该发生什么?tput以任何方式关心外壳在做什么吗?绞盘是否相关?我想问题是:

怎么tput知道终端的大小?

此外,我不想过多地混淆输出,但在示例的每个 shell 中,都设置了 TERM 并infocmp $TERM打印似乎有效的 terminfo 描述。(我认为,它提供任何输出的事实表明它是有效数据!)

4

1 回答 1

1

从描述中看不出来:

-Ttype
表示终端的类型。通常这个选项是不必要的,因为默认值取自环境变量TERM。如果-T指定了,那么 shell 变量 LINESCOLUMNS也将被忽略。

目前tput电话use_env和选项:use_tioctl-T

20171007
    + modify "-T" option of clear and tput to call use_tioctl() to obtain
      the operating system's notion of the screensize if possible.

tput手册页有一个Terminal Size部分,其中更详细。

此示例(使用 ncurses 6.1)按预期工作:

#!/bin/bash

trap "resize; tput cols; tput -T$TERM cols" WINCH

while true
do
        sleep 1
done

使用 ncurses 6.0,您会看到这种差异。对于其他实现,ymmv

关于bash,前段时间讨论过:tput cols 在脚本中无法正常工作-T(但 q/a 与该选项没有任何相关性)。

于 2020-04-21T19:41:09.793 回答