我对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
的输出更改为匹配新的终端大小。但是,在破折号中运行时,即使端子的大小已更改,tput
输出也不会更改。还要注意,WINCH处理程序似乎被破折号延迟了,并且直到输入下一个命令之后(但在执行之前)才执行。这里应该发生什么? tput
是否以某种方式关心外壳程序在做什么? WINCH与之相关吗?我想问题是:
tput
如何知道终端的大小?
[另外,我不想过多地弄乱输出,但是在示例的每个shell中,都设置了TERM,infocmp $TERM
打印似乎有效的terminfo描述。 (我认为它提供任何输出的事实表明它是有效数据!)
从描述中不明显:
-T
类型指示终端的类型。通常,此选项是不必要的,因为默认值来自环境变量TERM。如果指定-T,则外壳变量LINES
和COLUMNS
也将被忽略。
但是current tput
调用use_env
和use_env
作为use_tioctl
选项:
use_tioctl
此示例(使用ncurses 6.1)按预期工作:
-T
使用ncurses 6.0,您会看到不同。对于其他实现,ymmv。