一个古老的终端显示控制命令-tput命令|帮你解决中英文混合时终端列对齐输出问题

一个古老的终端显示控制命令-tput命令|帮你解决中英文混合时终端列对齐输出问题本文详细介绍了 Unix 和 Linux 终端下的 tput 命令 包括其基本用法 功能如清屏 光标定位 文本属性调整等 以及如何利用 terminfo 文件控制复杂的终端显示

大家好,欢迎来到IT知识分享网。

终端显示控制对于写一个 终端脚本 是非常有用的,在没有图形界面时Unix和类Unix系统用户都是在Terminal控制终端下工作的。虽然Linux操作系统的图形界面出现淡化了终端显示控制,但终端控制功能依旧是每个命令行用户不可或缺的一部分。只是我们不知道在使用它而已。

例如控制突出显示、光标位置以及对于 UTF-8 长度大于1个字节的文本显示( 中文、特殊符号)等。

tput这个命令可能很多朋友没有使用过,1980年代它就已经跟着unix存在了,之后不断发展到了今天。与之类似的命令有:

  • reset # 重置光标为第一行第一列,但不清空历史输出信息。
  • clear # 重置光标为第一行第一列,并清空终端所有输出。

本文带你了解一下tput命令的功能及使用方法。

命令用法

tput命令的使用语法:

 tput [-Ttype] capname [parameters] tput [-Ttype] [-x] clear tput [-Ttype] init tput [-Ttype] reset tput [-Ttype] longname tput -S << tput -V 

从简单的开始介绍:

$ tput -V # 查看使用ncurse库的版本 ncurses 6.3. # 如果terminfo文件存在,针对当前终端类型("-T"或TERM变量)的定义也存在,输出终端类型的完整名字。 $ tput -T xterm longname xterm terminal emulator (X Window System) $ tput -T linux longname Linux console $ tput clear # 清屏,将当前终端屏幕内容清空(再也找不到之前执行命令显示内容了),光标在第一行第一列位置。 $ tput reset # 跟 clear类似,但历史输出信息并不清除(clear 是清除历史内容的)。 $ tput init # 重新初始化终端信息,但不清屏幕内容,重置光标在下一行第一列。 $ env |grep TERM COLORTERM=truecolor TERM=xterm-256color # 使用“-S”选项,一次提供多个属性。首先清屏,把光标移至10行10列,设置背景色彩(蓝)。 $ tput -S <<END ; echo "hello world" clear cup 10 10 setb 1 END 

其中的参数:

  • -T type : 指定终端类型, 默认使用环境变量 $TERM 的终端类型,通常不用设置这个参数,支持的终端类型可以在Terminal窗口设置找到。
  • -S << :参数用于通过多行输入属性来控制终端显示。

终端显示控制用法

以上几个简单的命令描述完后,接下来我们在了解他的强大终端显示控制用法。

tput [-T type] capname [parameters] 
  • capname是terminfo文件中定义的一系列复杂的终端功能属性之一。例如,cols表示终端的列数,lines表示终端屏幕的行数,clear表示清屏,cup表示光标移动位置,is1is2is3表示初始化串,if表示初始化文件,iprog表示初始化程序等,完整的说明见terminfo (5)手册页。parms是终端功能属性capname的参数。例如,cup属性需要提供行与列两个参数。

光标属性相关

tput clear # 清除屏幕 tput sc # 记录当前光标位置 tput rc # 恢复光标到最后保存位置 tput civis # 光标不可见 tput cnorm # 光标可见 tput cup x y # 光标按设定坐标点移动 

文本属性相关

tput blink # 文本闪烁 tput bold # 文本加粗 tput el # 清除到行尾 tput smso # 启动突出模式 tput rmso # 停止突出模式 tput smul # 下划线模式 tput rmul # 取消下划线模式 tput sgr0 # 恢复默认终端 tput rev # 反相终端 

改变文本显示背景、前景颜色:

tput setb 颜色代号 tput setf 颜色代号 

颜色代号:

0:黑色 1:蓝色 2:绿色 3:青色 4:红色 5:洋红色 6:黄色 7:白色 

接下来分享一些实际使用的示例

示例:突出显示文本信息

下面是通过smso控制突出显示 “Name: “信息

bold=`tput smso` offbold=`tput rmso` echo "${bold}Name: ${offbold} ¥c" 

下面示例通过capname为sgr控制突显和下划线:

tput sgr x y tput sgr 0 1 turn off standout; turn on underline tput sgr 0 0 turn off standout; turn off underline tput sgr 1 1 turn on standout; turn on underline tput sgr 1 0 turn on standout; turn off underline echo "`tput sgr 1 1`Name: `tput sgr 0 0` ¥c" echo "`tput sgr 0 1`Name: `tput sgr 0 0` ¥c" echo "`tput sgr 0 1`Name: `tput sgr0` ¥c" 

示例:中英文输出控制列宽度

中英文混合显示测试示例(中文字符UTF-8存储长度为3,但Terminal终端显示占用长度为2, 因此实际终端会出现对不齐问题)

strings=( "这是一个Test文本" "This is a test" "This is 一个 很长很长的Test Test Test Test" ) LEN="30" line printf '\n%s\n' 'normal:' for str in "${strings[@]}"; do printf "|%-20s|\n" "$str" done printf '\n%s\n' 'tput:' for str in "${strings[@]}"; do printf "|%-${LEN}.${LEN}s" "$str" ; tput hpa $LEN ; printf "|\n" done 

执行后效果如下(由于粘贴到文本中跟终端显示情况不一致,只能贴图了):

在这里插入图片描述

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/122098.html

(0)
上一篇 2025-10-19 12:10
下一篇 2025-10-19 12:20

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信