什么因素会改变`tput lines`命令的执行结果?为何会返回默认值24?
问题原因分析
tput lines的取值逻辑
tput获取终端行数的优先级如下:
- 优先读取当前进程的
LINES环境变量 - 如果未读取到
LINES变量,或者当前进程的标准输入/输出/错误流没有关联TTY(终端),则会查询terminfo数据库中对应$TERM类型的默认配置,你使用的xterm-256color默认行数就是24,这是早期终端的通用默认规格。
为什么返回值存在波动
你遇到的返回值波动完全匹配两个触发默认值的场景:
场景1:命令替换$(tput lines)触发默认值
Bash中LINES属于shell动态维护的特殊变量,默认不会被导出到子进程/子shell,你使用的Mac自带Bash 3.2版本严格遵循这个逻辑。所有放在$( )里的命令都会在独立子shell中运行,子shell拿不到父进程的LINES变量,tput就会返回默认的24。
对照你直接运行脚本的结果可以验证:所有返回24的调用全是$(tput lines)的形式,完全符合这个规则。
场景2:管道传输时触发默认值
当你用./testtput | pbcopy运行时,整个脚本的标准输出关联的是管道而非TTY,此时tput检测到输出流不是终端,就不会尝试查询实际终端尺寸,直接返回terminfo的默认24。
对照管道运行的结果可以验证:所有tput调用(包括直接调用和命令替换调用)都返回24,和你的测试结果完全一致。
修复方案
如果需要所有场景都返回正确的行数,只要提前把LINES变量导出为环境变量即可:
export LINES ./testtput
也可以运行脚本时手动传入LINES:
LINES=$LINES ./testtput
内容的提问来源于stack exchange,提问作者for2ando
相关产品推荐
相关产品推荐

