tput 不尝试 /dev/tty (?)

tput 不尝试 /dev/tty (?)

在 Ubuntu 23.10 中,echo -e "lines\ncols" | tput -S >/tmp/xx 2>&1始终将“24\n80”写入文件不管终端尺寸。

的手册页tput说它依次测试 stderr、stdout、stdin 并最终“/dev/tty”,但它似乎并没有真正用上面的命令尝试 /dev/tty,因此产生了 24x80 的回退。

有人能指出这个问题吗?

(我重定向 stdout 和 stderr 的原因是某些版本的 BSD 会将错误消息写入 stderr 并且我希望我的脚本即使在没有终端的情况下运行也不会发出任何声音 - 在这种情况下默认的 24x80 是正确的)。

答案1

需要加上“初始化”或“重置”

echo -e "lines\ncols" | tput init -S >/tmp/xx 2>&1

明确地man tput将其放在“init 命令”下:

init 如果终端数据库存在并且用户终端的条目存在(参见上面的 -Ttype),则会发生以下情况:

(1)首先,tput 检索终端的当前终端模式设置。它通过连续测试

• 标准误差,

• 标准输出,

• 标准输入和

• 最终为“/dev/tty”

$ cat /tmp/xx
24
80

$ cat /tmp/xx
70
113

替代解决方案

正如您在评论中所说,您不想发送初始化序列。在这种情况下,您可以将其拆分为两个命令:

{ tput lines; tput cols; } >/tmp/xx 2>&1

答案2

所述方法始终返回 24 x 80:

$ echo -e "lines\ncols" | tput -S >/tmp/xx 2>&1
$ cat /tmp/xx
24
80

要找到真实的高度/宽度,您可以使用此方法:

$ stty size
30 92

答案3

为了tput能够找到当前终端屏幕的列/行,三个标准流 STDIN、STDOUT 和 STDERR 中至少一个需要是 tty(而不是管道/文件)...含义:

echo -e "lines\ncols" | tput -S >/tmp/xx 2>&1

...将 STDIN(在文件描述符处0)作为管道,将 STDOUT(在文件描述符处1)作为文件,并将 STDERR(在文件描述符处2)作为文件描述符重定向到 STDOUT ...因此,实际上都不是 tty。

因此,可以释放以下三个中的一个:

$ echo -e "lines\ncols" | tput -S >file; cat file
38
154

... 其中 STDERR 是一个 tty ... 或者:

$ tput -S >file 2>&1; cat file
lines
cols
38
154

... 其中 STDIN 是一个 tty ... 或者:

$ echo -e "lines\ncols" | tput -S 2>&1
38
154

...其中 STDOUT 是一个 tty。

或者,也可以使用它的一个特殊命令tput来测试,即/dev/tty@DanielT 的回答

相关内容