tput lines和tput cols可直接获取终端行数与列数,但依赖正确设置的$TERM变量;光标位置无法可靠读取,tput u7支持有限且不推荐生产使用。

怎么用 tput 获取终端尺寸和光标位置
终端尺寸(行数、列数)是很多脚本的基础前提,tput lines 和 tput cols 直接返回整数,但要注意它们依赖 $TERM 环境变量和本地 terminfo 数据库。如果在 SSH 会话或容器里执行失败,大概率是 TERM 为空或设为 unknown。
-
tput lines和tput cols返回的是当前终端“逻辑尺寸”,不是窗口实际像素大小,也不随终端缩放实时更新 - 在 tmux 或 screen 会话中,需确保子 shell 继承了正确的
TERM(通常是screen或tmux-256color) - 获取光标当前位置不可靠:
tput没有标准能力读取当前坐标;tput u7(请求光标位置)仅部分终端支持,且需配合 ANSI 序列解析,不建议在生产脚本中依赖
怎么安全地设置颜色和文本样式
颜色设置最常踩的坑是忘记重置,导致后续所有输出都带样式。优先用 setaf/setab(ANSI 风格),而非过时的 setf/setb —— 后者只支持 0–7 的基础色,且在 256 色终端下行为不一致。
-
tput setaf 2设置绿色前景,tput setab 4设置红色背景;数字对应 ANSI 色表(0=黑,1=红,2=绿…) - 加粗、下划线、反显等样式应成对使用:
tput bold+tput sgr0,不能只开不开关 - 组合样式时,顺序无关,但
tput sgr0必须放在最后;它会关闭所有属性,包括颜色、粗体、下划线 - 避免直接拼接:
echo "$(tput setaf 3)text$(tput sgr0)"比tput setaf 3; echo text; tput sgr0更可靠,防止中间出错导致样式残留
怎么移动光标而不破坏终端状态
tput cup 是最常用也最容易误用的命令:它的参数顺序是 row column(先行后列),且行列编号从 0 开始 —— 这和多数 GUI 坐标系相反,容易写反。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
tput cup 0 0移动到左上角,等价于tput home;tput cup 999 999会自动折回到右下角,不是报错 - 相对移动更安全:
tput cuf 5(右移 5 列)、tput cuu 2(上移 2 行),适合在已有输出后微调位置 - 保存/恢复光标位置(
tput sc/tput rc)只保留最后一次保存点,嵌套使用会覆盖;多次保存需自己管理栈 - 在管道或重定向环境中(如
tput cup 5 10 | cat),光标移动会被丢弃,因为tput输出的是控制序列,不是普通文本
为什么 tput reset 和 tput clear 不是一回事
这两个命令常被混用,但语义完全不同:tput clear 只清屏并归位光标;tput reset 是向终端发送初始化序列,试图恢复默认状态 —— 它不保证清屏,也不清除历史缓冲区(scrollback)。
-
tput clear等价于printf '\033[2J\033[H',干净、可预测,适合脚本开头清屏 -
tput reset实际调用的是reset命令底层逻辑,可能重置波特率、行模式等,一般只在终端乱码或失控时手动触发 - 真正需要“还原所有样式”的操作是
tput sgr0,不是reset;后者不会影响颜色或字体样式 - 在 CI/CD 环境或无终端的环境(如 cron job)中运行
tput可能失败,应加判断:if command -v tput >/dev/null && [ -t 1 ]; then tput clear; fi
实际用起来,最难的不是记住每个 capname,而是理解 tput 本质是向终端“发指令”,不是修改 shell 自身状态。所有效果都依赖终端正确解析 ANSI/terminfo 序列,而不同终端(xterm、gnome-terminal、iTerm2、Windows Terminal)对非标准能力的支持程度差异很大 —— 测试时别只盯着一个终端看。










