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

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

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

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

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

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

命令用法

tput命令的使用语法:

       tput [-Ttype] capname [parameters]tput [-Ttype] [-x] cleartput [-Ttype] inittput [-Ttype] resettput [-Ttype] longnametput -S  <<tput -V

从简单的开始介绍:

$  tput -V   # 查看使用ncurse库的版本
ncurses 6.3.20211021# 如果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 ytput 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 underlineecho "`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[@]}"; doprintf "|%-20s|\n" "$str"
doneprintf '\n%s\n' 'tput:'
for str in "${strings[@]}"; doprintf "|%-${LEN}.${LEN}s" "$str" ; tput hpa $LEN ; printf "|\n"
done

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/598909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode:129. 求根节点到叶节点数字之和 | 二叉树 + 递归】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

MySQL 8.0 ReplicaSet备库切换为可读写单库

MySQL 8.0 ReplicaSet备库切换为可读写单库 方法一方法二 方法一 从集群中删除备库&#xff08;不会改变备库只读状态&#xff09; # 检查备库标识 var rs dba.getReplicaSet() rs.status()# 移除备库同步 rs.removeInstance("MYSQL_REPLICA_IDENTIFIER:3306") #或…

记录汇川:水塔指令解释-ST

可以通过帮助查看指令手册 PLC的IO地址映射-两种方法 第一种&#xff1a; 新建一个全局变量表&#xff0c;按照如图所示建立IO地址 第二种&#xff1a; 直接如图所示位置定义名字 注意&#xff1a;IW和QB这两个前面一个有蓝色M一个没有。 蓝色的M表示模块发生变化的时候地址不会…

【S32K 进阶之旅】 NXP S32K3 以太网 RMII 接口调试(1)

前言 大联大世平集团推出了一款基于 NXP 车规级 MCU S32K344 的开发板——花名“Cavalry”&#xff0c;它使用 BGA257 封装的 32 位 ArmCortex-M7 S32K344 作为主控芯片&#xff0c;在69.6*130mm 的小体积开发板上搭载了 SBC 电源管理芯片、CAN 收发器、LIN 收发器、FLASH 存储…

低噪声,高增益的音频信号处理电路芯片选型分析

随着智能手机、汽车音频、AI智能音箱&#xff0c;智能家居、家庭影院、平板电脑、笔记本电脑等智能设备的普及&#xff1b;数字音频功放芯片的应用也越来越广泛&#xff1b;同时对音频信号处理的芯片的性能要求越来越高&#xff1b;以下几款就是常用热门音频信号处理电路芯片分…

NVM NodeJs版本管理 通关宝典

NVM NodeJs版本管理 通关宝典&#x1f3f9; 文章目录 NVM NodeJs版本管理 通关宝典&#x1f3f9;一、NVM是什么二、开始使用NVM三、NVM 命令速查四、手动安装特定Node版本(Windows)&#x1f644;4.1 NVM for windows 运行机制4.2 手动安装流程 五、切换 NVM 下载镜像源六、常见…

日志级别及其作用

在软件开发与运维过程中&#xff0c;日志是至关重要的部分&#xff0c;它记录了系统运行时的各种状态信息&#xff0c;包括错误、警告、调试信息等。不同的日志级别用于区分不同重要程度的信息&#xff0c;便于开发者和运维人员快速定位问题&#xff0c;优化系统性能&#xff0…

21. Mysql 事件或定时任务,解放双手,轻松实现自动化

文章目录 概念常见操作事件调度器操作查看事件创建事件删除事件启动与关闭事件 精选示例构造实时数据定时统计数据 总结参考资料 概念 Mysql 事件是一种在特定时间点自动执行的数据库操作&#xff0c;也可以称呼为定时任务&#xff0c;它可以自动执行更新数据、插入数据、删除…

x-cmd pkg | doggo - 现代化的 DNS 客户端

目录 简介首次用户快速实验指南功能特点类似工具与竞品进一步探索 简介 doggo 是一个由 Karan Sharma 于 2020 年使用 Go 语言开发的 DNS 客户端。它类似于 dig 命令&#xff0c;但旨在以现代化、简洁和可读的格式输出 DNS 查询结果。 首次用户快速实验指南 使用 x doggo 即可…

vue浏览器预览word文件

XDOC&#xff08;最终实现方法&#xff09; XDOC官方文档 window.open(https://view.xdocin.com/view?src encodeURIComponent(url), _blank);Office Online&#xff08;尝试报错&#xff09; window.open( https://view.officeapps.live.com/op/view.aspx?src url, _bl…

1.4 day4 IO进程线程

使用两个子进程进行文件拷贝&#xff0c;父进程进行资源回收 #include <myhead.h> int main(int argc, const char *argv[]) {//创建一个文件描述符并以只读的方式打开int fd-1;if((fdopen("./test.bmp",O_RDONLY))-1){perror("open error");return…

0.5(Euler-Maruyama), 1(Milstein), 和1.5 阶强Stochastic Differential Equation格式总结

本文的目的在于提供0.5&#xff0c;1和1.5阶强SDE数值格式的推导和内容&#xff0c;所有推导基于 I t o − T a y l o r Ito-Taylor Ito−Taylor展开&#xff0c;由于国内外网站缺少关于强SDE数值阶的总结&#xff0c;笔者在此特作总结&#xff0c;为使用SDE数值格式的读者提供…

Maven打包使用多线程加速构建过程

在Maven项目中&#xff0c;特别是在包含大量模块的大型项目构建时&#xff0c;编译和打包阶段可能会消耗较长时间。为了提升构建效率&#xff0c;Maven支持通过多线程进行并行构建&#xff0c;从而显著减少整体打包时间。本文将介绍两种启用Maven多线程打包的方式&#xff1a;命…

IDAPython详细版(二)

六&#xff1a;操作数 可以使用idc.get_openrand_typed(ea,n)得到操作数的类型。ea是地址&#xff0c;n是索引 这里有8种不同类型的操作数类 0_void 如果一个指令木有任何操作数它将返回0 0_reg 如果一个操作数是一个普通的寄存器将返回此类型。这个值在内部表示为1. o_mem …

java: 写入数据到HBase

一、添加依赖 <dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.apache.hbase</groupId><art…

使用EasyPoi导入数据并返回失败xls

添加依赖 <!-- https://mvnrepository.com/artifact/cn.afterturn/easypoi-base --> <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.4.0</version> </dependency> 工…

Prometheus-Alertmanage钉钉实现告警

获取钉钉的webhook地址 1、注册企业钉钉 a、注册企业钉钉 浏览器打开钉钉注册页面 填入手机号码&#xff0c;填入获取到的验证码&#xff0c;点注册 填入企业资料并注册 注册成功后&#xff0c;扫描二维码下载钉钉&#xff0c;如下图&#xff1a; b、添加机器人 管理后台 因…

Modbus RTU Learn

一、传输方式 采用主从应答方式进行 帧格式 功能码对应寄存器 演示01功能码 返回数据 0F 转换成二进制 02功能码 0F 转换成二进制 03功能码 读两个寄存器 04功能码 返回数据&#xff0c;读两个寄存器 05功能码 06功能码 10功能码 响应报文

在centos上安装WordPress 及创建配置文件无反应的解决方案

一、安装Apache服务 1.直接在命令行中输入以下命令即可,顺便安装编译组件&#xff1a; yum install -y httpd yum install -y httpd-devel2.启动Apache服务和设置Apache自启&#xff1a; 1 systemctl start httpd 2 systemctl enable httpd 3.添加一个测试页面&#xff0c;…

【LeetCode】1204. 最后一个能进入巴士的人

表: Queue ---------------------- | Column Name | Type | ---------------------- | person_id | int | | person_name | varchar | | weight | int | | turn | int | ---------------------- person_id 是这个表具有唯一值的列。 该表展示了所…