SIGWINCH,bash,破折号,tput和terminfo

问题描述 投票:0回答:1

我对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描述。 (我认为它提供任何输出的事实表明它是有效数据!)

ncurses terminfo tput
1个回答
0
投票

从描述中不明显:

-T 类型指示终端的类型。通常,此选项是不必要的,因为默认值来自环境变量TERM。如果指定-T,则外壳变量LINESCOLUMNS也将被忽略。

但是current tput调用use_envuse_env作为use_tioctl选项:

use_tioctl

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

-T

使用ncurses 6.0,您会看到不同。对于其他实现,ymmv

© www.soinside.com 2019 - 2024. All rights reserved.