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

终端显示控制对于写一个 终端脚本 是非常有用的,在没有图形界面时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.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 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

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能视频监控技术在旅游业中如何发挥最大作用,助力旅游业发展

随着“南方小土豆勇闯哈尔滨”的词条霸榜热搜&#xff0c;大众旅游热情再次点燃。最近哈尔滨游客爆满的情况&#xff0c;极易发生游客迷路、景区瘫痪、交通堵塞等情况&#xff0c;当地有关部门的压力不言而喻。对于节假日或者“破天富贵”、“报复性旅游”的情况&#xff0c;景…

书生·浦语大模型实战1

书生浦语大模型全链路开源体系 视频链接&#xff1a;书生浦语大模型全链路开源体系_哔哩哔哩_bilibili 大模型之所以能收到这么高的关注度&#xff0c;一个重要原因是大模型是发展通用人工智能的重要途径 深度信念网络&#xff1a; &#xff08;1&#xff09;又被称为贝叶斯网…

数据库基本知识2

目录 为保证数据库是可恢复的&#xff0c;登记日志文件时 排他锁 并发操作带来的数据不一致性 数据模型的三要素 数据独立性 为保证数据库是可恢复的&#xff0c;登记日志文件时 为保证数据库是可恢复的&#xff0c;登记日志文件时必须遵循两条原则&#xff1a; 1. 登记的…

nginx编译时添加额外第三方模块

比如要添加第三方流量监控模块nginx-module-vts 1、官网 官网 Releases vozlt/nginx-module-vts GitHubNginx virtual host traffic status module. Contribute to vozlt/nginx-module-vts development by creating an account on GitHub.https://github.com/vozlt/nginx-mo…

如何使用 Python 解决网络抓取中的 reCAPTCHA 问题

在网络抓取的领域&#xff0c;开发人员经常面临 reCAPTCHA 的障碍。为了区分人类和自动化机器人&#xff0c;reCAPTCHA 可能会成为那些试图从网站提取数据的人的沉痛阻碍。然而&#xff0c;借助 Python 和像 Capsolver 这样的工具&#xff0c;可以绕过 reCAPTCHA 并继续抓取有价…

又一券商被点名,网络安全问题不容忽视

12月25日&#xff0c;黑龙江证监局发布公告表示&#xff0c;江海证券存在关于IT治理、网络安全管理的内部决策、执行机制不健全&#xff1b;公司App个人信息保护合规性检测不充分&#xff0c;App强制、频繁、过度索取权限等问题。因此&#xff0c;黑龙江证监局决定对江海证券采…

java数据结构与算法刷题-----LeetCode509. 斐波那契数

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

2024年华为hcie方向有哪些?hcie 考点在哪里?

华为作为全球领先的ICT解决方案供应商&#xff0c;其认证体系在业内具有极高的权威性和认可度。其中&#xff0c;华为认证体系中的最高级别认证——HCIE&#xff0c;已经成为无数技术爱好者追求的目标。下面将探讨华为HCIE的方向及其考点&#xff0c;希望能对那些有志于获取HCI…

数字IC后端实现之Innovus TA-152错误解析(分频generated clock定义错误)

**ERROR: (TA-152): A latency path from the ‘Fall’ edge of the master clock at source pin… Error Code TA-152 在数字IC后端实现innovus中我们经常会看到这类Error&#xff0c;具体信息如下所示。 Error Message **ERROR: (TA-152): A latency path from the ‘Fa…

【第6期】使用Iview的Select组件进行远程搜索并在编辑时设置一个或多个默认值

本期简介 下拉框这个组件用的地方非常多&#xff0c;普通用法就是将数据列表一次性查询渲染&#xff0c;在列表里面直接本地搜索&#xff0c;优点是可缓存、速度快&#xff0c;但在某些场合并不适用&#xff0c;比如要在下拉框中选择一所中国的学校&#xff0c;幼儿园/小学/初…

[AutoSar]DaVinci Developer 命名规范

目录 关键词平台说明一、背景二、Component命名约定2.1Component Type Composition&#xff08;CtCo&#xff09;2.2Component Type Application&#xff08; CtAp&#xff09;2.3Component Type SensorActuator&#xff08;CtSa&#xff09;2.4Component Type Complex Driver&…

ThreadPoolExecutor中的keepAliveTime详解

一.keepAliveTime的概念&#xff1a; keepAliveTime的单位是纳秒&#xff0c;即1s1000000000ns&#xff0c;1秒等于10亿纳秒。 keepAliveTime是线程池中空闲线程等待工作的超时时间。 当线程池中线程数量大于corePoolSize&#xff08;核心线程数量&#xff09;或设置了allowCor…

【自学笔记】01Java基础-07面向对象基础-01封装

记录学习Java基础中有关面向对象编程的基础知识&#xff0c;包括面向对象思想&#xff0c;构造方法&#xff0c;封装思想&#xff0c;JavaBean。 1 面向对象概述 1.1 什么是面向对象编程 严谨来说&#xff1a;   面向对象编程&#xff08;Object-Oriented Programming&…

SpringBoot Redis入门(一)——redis、Lettuce、Redisson使用

本章&#xff1a;将展示SpringBoot集成Redis三种客户端的配置要点和常见应用示例&#xff1b;下章&#xff1a;自行实现一个方法级的缓存注解&#xff0c;简化版的Cacheable&#xff0c;使初学者加深对Spring缓存框架的理解。 一、Lettuce客户端 Lettuce 是一种可扩展的、线程…

lf 的年终总结(2023)

这一年&#xff0c; 我没有进行总结&#xff0c; 只有年终的回顾。 是的&#xff0c; 我又长了一岁&#xff0c; 同时也度过了三年的开发经历&#xff0c; 即将进入五年 Android 开发的阶段。 我只希望在新的一年里能够好好学习&#xff0c;期待有所提升。 回顾过去的生活&…

FAST-LIO2:论文和算法解析

文章目录 摘要一、简介二、相关工作2.1雷达惯导里程计2.2 建图过程中的动态数据结构 三、系统架构四、状态估计A. 卡尔曼模型1.状态转换模型2.测量模型 B.迭代卡尔曼滤波1. 预测过程2. 残差计算3.迭代更新 五、建图A.地图管理B.树的结构与创建1.数据结构2.ikd树的创建 C.地图的…

给Flutter + FireBase 增加 badge 徽章,App启动器 通知红点。

在此之前需要配置好 firebase 在flutter 在项目中。&#xff08;已经配置好的可以忽略此提示&#xff09; Firebase 配置教程&#xff1a;flutter firebase 云消息通知教程 (android-安卓、ios-苹果)_flutter firebase_messaging ios环境配置-CSDN博客 由于firebase 提供的消息…

ThreadLocal 是什么?它的实现原理呢?

一个工作了 4 年的小伙伴&#xff0c;又私信了我一个并发编程里面的问题。 他说他要抓狂了&#xff0c;每天 CRUD&#xff0c;也没用到过 ThreadLocal 啊&#xff0c;怎么就不能问我怎么写CRUD 呢&#xff1f; 我反问他如果只问你项目和业务&#xff0c;那有些 4 年的小伙伴他…

光线追踪原理

理论 参考 实现光线追踪算法 光线追踪算法采用由像素组成的图像。对于图片中的每个像素&#xff0c;它会将主光线射入场景&#xff08;从眼睛&#xff08;或相机&#xff09;射入场景的第一条光线称为主光线、能见度光线或相机光线。&#xff09;。该主光线的方向是通过追踪…

2.0.0 BGP高级特性-ASFilter、CommunityFilter、ORF、对等组

Peer Group BGP对等体组 在网络中出现多台设备配置相近的情况下&#xff0c;使用对等体组可以极大的减少配置命令的输入。 与端口组类似&#xff0c;通过创建一个组&#xff0c;然后将成员添加入其中&#xff0c;可以对组中的成员进行统一的管理。 案例配置1 以AR2为例&…