使用tput和dialog增强脚本用户体验

立即解锁
发布时间: 2025-09-09 01:53:49 阅读量: 11 订阅数: 23 AIGC
PDF

Linux命令行进阶之旅

### 使用 tput 和 dialog 增强脚本用户体验 #### 1. tput 的使用 在 Linux 系统中,terminfo 数据库定义了许多不同的终端类型和终端功能名称(capnames)。不过在实际使用中,我们在 Linux 系统上遇到的终端类型通常只支持相对较少的一部分 capnames。 ##### 1.1 读取终端属性 tput 可以输出一些终端属性的值到标准输出,以下是一些常见的 capname 及其描述: | Capname | 描述 | | ---- | ---- | | longname | 终端类型的全名 | | lines | 终端的行数 | | cols | 终端的列数 | | colors | 可用的颜色数量 | 其中,`lines` 和 `cols` 的值是动态的,会随着终端窗口大小的变化而更新。我们可以使用以下别名来查看当前终端窗口的大小: ```bash alias term_size=`echo "Rows=$(tput lines) Cols=$(tput cols)"` ``` 定义并执行这个别名后,会显示当前终端的大小。当我们改变终端窗口大小后再次执行该别名,显示的值会更新。 我们还可以利用 SIGWINCH 信号,该信号会在终端窗口大小改变时发送。以下是一个示例脚本: ```bash #!/bin/bash # term_size2 - Dynamically display terminal window size redraw() { clear echo "Width = $(tput cols) Height = $(tput lines)" } trap redraw WINCH redraw while true; do : done ``` 在这个脚本中,我们启动了一个空的无限循环,并设置了一个信号处理函数来捕获 SIGWINCH 信号。每次终端窗口大小改变时,`redraw` 函数会被触发,显示新的终端大小。按 Ctrl - c 可以退出该脚本。 ##### 1.2 控制光标 以下 capnames 可以输出控制代码字符串,用于控制终端中的光标: | Capname | 描述 | | ---- | ---- | | sc | 保存光标位置 | | rc | 恢复光标位置 | | home | 将光标移动到左上角 (0,0) | | cup <row> <col> | 将光标移动到指定的行和列 | | cud1 | 将光标向下移动 1 行 | | cuu1 | 将光标向上移动 1 行 | | civis | 设置光标为不可见 | | cnorm | 设置光标为正常状态 | 我们可以修改之前的脚本,使用光标定位并将窗口尺寸信息显示在终端中央: ```bash #!/bin/bash # term_size3 - Dynamically display terminal window size # with text centering redraw() { local str width height length width=$(tput cols) height=$(tput lines) str="Width = $width Height = $height" length=${#str} clear tput cup $((height / 2)) $(((width / 2) - (length / 2))) echo "$str" } trap redraw WINCH redraw while true; do : done ``` 这个脚本同样设置了 SIGWINCH 信号的捕获和无限循环,但 `redraw` 函数更复杂,需要每次窗口大小改变时计算终端窗口的中心位置。 ##### 1.3 文本效果 类似于光标操作的 capnames,以下 capnames 可以输出控制代码字符串,影响终端显示文本字符的方式: | Capname | 描述 | | ---- | ---- | | bold | 开始显示粗体文本 | | smul | 开始显示下划线文本 | | rmul | 结束显示下划线文本 | | rev | 开始显示反显文本 | | blink | 开始显示闪烁文本 | | invis | 开始显示不可见文本 | | smso | 开始显示“突出”模式 | | rmso | 结束显示“突出”模式 | | sgr0 | 关闭所有属性 | | setaf <value> | 设置前景色 | | setab <value> | 设置背景色 | 有些属性(如下划线和突出模式)有开启和关闭的 capname,而有些只有开启的 capname,此时可以使用 `sgr0` 恢复文本显示为“正常”状态。以下是一个演示常见文本效果的简单脚本: ```bash #!/bin/bash # tput_characters - Test various character attributes clear echo "tput character test" echo "===================" echo tput bold; echo "This text has the bold attribute."; tput sgr0 tput smul; echo "This text is underlined (smul)."; tput rmul # Most terminal emulators do not support blinking text (though xterm # does) because blinking text is considered to be in bad taste ;-) tput blink; echo "This text is blinking (blink)."; tput sgr0 tput rev; echo "This text has the reverse attribute"; tput sgr0 # Standout mode is reverse on many terminals, bold on others. tput smso; echo "This text is in standout mode (smso)."; tput rmso tput sgr0 echo ``` ##### 1.4 文本颜色 大多数终端支持 8 种前景文本颜色和 8 种背景颜色(有些支持多达 256 种)。使用 `setaf` 和 `setab` 功能可以设置前景色和背景色。颜色的具体显示可能难以预测,因为许多桌面管理器会对终端窗口应用“系统颜色”。以下是颜色值对应的颜色: | 值 | 颜色 | | ---- | ---- | | 0 | 黑色 | | 1 | 红色 | | 2 | 绿色 | | 3 | 黄色 | | 4 | 蓝色 | | 5 | 品红色 | | 6 | 青色 | | 7 | 白色 | | 8 | 未使用 | | 9 | 恢复为默认颜色 | 以下脚本使用 `setaf` 和 `setab` 功能显示可用的前景/背景颜色组合: ```bash #!/bin/bash # tput_colors - Demonstrate color combinations. for fg_color in {0..7}; do set_foreground=$(tput setaf $fg_color) for bg_color in {0..7}; do set_background=$(tput setab $bg_color) echo -n $set_background$set_foreground printf ' F:%s B:%s ' $fg_color $bg_color done echo $(tput sgr0) done ``` ##### 1.5 清除屏幕 以下 capnames 可以选择性地清除终端显示的部分内容: | Capname | 描述 | | ---- | ---- | | smcup | 保存屏幕内容 | | rmcup | 恢复屏幕内容 | | el | 从光标位置清除到行尾 | | el1 | 从光标位置清除到行首 | | ed | 从光标位置清除到屏幕末尾 | | clear | 清除整个屏幕并将光标移到左上角 | 以下是一个使用这些终端功能的脚本,它包含一个菜单和一个单独的输出区域,用于显示系统信息: ```bash #!/bin/bash # tput_menu: a menu driven system information program BG_BLUE="$(tput setab 4)" BG_BLACK="$(tput setab 0)" FG_GREEN="$(tput setaf 2)" FG_WHITE="$(tput setaf 7)" # Save screen tput smcup # Display menu until selection == 0 while [[ $REPLY != 0 ]]; do echo -n ${BG_BLUE}${FG_WHITE} clear cat <<- _EOF_ Please Select: 1. Display Hostname and Uptime 2. Display Disk Space 3. Display Home Space Utilization 0. Quit _EOF_ read -p "Enter selection [0-3] > " selection # Clear area beneath menu tput cup 10 0 echo -n ${BG_BLACK}${FG_GREEN} tput ed tput cup 11 0 # Act on selection case $selection in 1) echo "Hostname: $HOSTNAME" uptime ;; 2) df -h ;; 3) if [[ ```
corwn 最低0.47元/天 解锁专栏
买1年送3月
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

吴雄辉

高级架构师
10年武汉大学硕士,操作系统领域资深技术专家,职业生涯早期在一家知名互联网公司,担任操作系统工程师的职位负责操作系统的设计、优化和维护工作;后加入了一家全球知名的科技巨头,担任高级操作系统架构师的职位,负责设计和开发新一代操作系统;如今为一名独立顾问,为多家公司提供操作系统方面的咨询服务。
最低0.47元/天 解锁专栏
买1年送3月
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看

最新推荐

AndroidStudio开发工具全解析

### Android Studio开发工具全解析 #### 1. 创建硬件配置文件 AVD管理器为常见设备提供了预定义的硬件配置文件,方便我们将其添加到AVD定义中。若需要定义不同的设备,可创建新的硬件配置文件,有从头开始定义和复制现有配置文件两种方式,但要注意预加载的硬件配置文件不可编辑。 - **从头创建新硬件配置文件**: 1. 进入“Select Hardware”页面,点击“New Hardware Profile”。 2. 在“Configure Hardware Profile”页面按需更改硬件配置文件属性,然后点击“Finish”。 3. 新的硬件配

使用Prometheus监控Kubernetes应用

### 使用 Prometheus 监控 Kubernetes 应用 #### 1. 准备工作 首先,通过 SSH 连接到主节点,使用以下命令: ```bash ssh azureuser@<dnsPrefix>.<azureLocation>.cloudapp.azure.com ``` 然后检查 Windows 节点是否在端口 9323 和 9182 上导出指标: ```bash azureuser@k8s-master-36012248-0:~$ curl http://10.240.0.65:9323/metrics # HELP builder_builds_failed_tota

手势控制与安卓自动化控制项目实践

# 手势控制与安卓自动化控制项目实践 ## 1. 手势控制设备 ### 1.1 手势方向判断 首先,需要根据 `Gesture_Horizontal` 和 `Gesture_Vertical` 的绝对值来判断手势的方向。具体规则如下: - 比较 `Gesture_Horizontal` 和 `Gesture_Vertical` 的绝对值,绝对值较大的那个对应的轴就是手势运动所在的轴。 - 对于垂直轴: - 若计数值为负,则手势为向后方向。 - 若计数值为正,则手势为向前方向。 - 对于水平轴: - 若计数值为负,则手势为向右方向。 - 若计数值为正,则手势为向左方向。 以下

飞控多传感器融合技术深度剖析:XV-15实战经验全公开,提升系统精度必读!

![飞控多传感器融合技术深度剖析:XV-15实战经验全公开,提升系统精度必读!](https://img-blog.csdnimg.cn/2018111714491619.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaWJvMTIzMDEyMw==,size_16,color_FFFFFF,t_70) # 摘要 本文围绕多传感器融合技术在飞行控制系统中的应用展开研究,系统梳理了多传感器融合的核心理论体系,涵盖传感器数据特性

深入探索Hugo的高级特性与功能

### 深入探索Hugo的高级特性与功能 #### 1. 开发多语言网站 在Web开发中,一旦引入多语言需求,事情就会变得复杂起来。不过Hugo很好地支持了多语言网站的开发,并提前做好了规划来应对这种复杂性。 ##### 1.1 启用新语言 要启用新语言,需要更新全局网站配置,使其在`languages`部分具有语言特异性。可以在`config`文件夹中创建一个名为`languages`的文件,以提供特定语言的偏好设置。在`languages`部分,每个键代表一种新语言,键对应的值列表会覆盖配置中提供的默认值。可以覆盖所有参数和顶级文本属性,如标题。甚至`baseURL`也可以有不同的域名

机器学习模型偏差修复技术全解析

### 机器学习模型偏差修复技术全解析 #### 1. 模型偏差修复的必要性与监测 在机器学习模型的实际应用中,我们无法保证模型表现的稳定性。即使在虚拟环境下,模型性能仅下降约 5%,但在实际部署后,由于数据漂移、现实操作环境变化以及其他意外情况,这种下降可能会产生不同的影响。因此,模型部署后,对其性能和偏差进行监测是十分必要的。 #### 2. 预处理技术 重加权是一种常见的预处理技术,除此之外,还有其他流行的方法。预处理技术简单、直接且直观,能在可接受的精度损失下,显著改善模型偏差。例如,可参考 AIF360 了解更多可靠的预处理技术。 #### 3. 处理中技术 处理中偏差修复技术

JPA实体状态管理与操作指南

### JPA 实体状态管理与操作指南 #### 1. 控制实体管理器的刷新模式 我们可以通过实体管理器(EntityManager)的 `FlushModeType` 设置来控制其行为。以下是一个示例代码: ```java em.getTransaction().begin(); Item item = em.find(Item.class, ITEM_ID); item.setName("New Name"); em.se

Helm安全与操作:从环境清理到数据验证

# Helm 安全与操作:从环境清理到数据验证 ## 1. Helm 操作基础 ### 1.1 Helm 图表安装与 CRD Helm 图表安装时,会先安装 Guestbook CRD。若集群中已有该 CRD,则跳过创建,直接安装模板。不过,CRD 存在一些局限性: - Helm 不允许 CRD 包含 Go 模板,因此无法像典型资源那样进行参数化。 - CRD 不能升级、回滚或删除。 - 在图表中包含 CRD 要求用户在 Kubernetes 集群中拥有提升的集群级权限。 ### 1.2 创建 Guestbook CR 的 Helm 图表 为了让最终用户能够创建部署 Guestbook 应

企业环境中的多线程使用

# 企业环境中的多线程使用 在软件开发中,线程处理是一个常见的问题,尤其是在企业应用程序中,线程处理更为重要且有时难度更大。一个线程中的错误可能会影响整个系统甚至基础设施。本文将介绍在企业环境中使用多线程的几种方法,包括构建带返回结果的异步任务、使用异步任务进行事务处理、检查异步任务的状态、构建带返回结果的托管线程以及调度带返回结果的异步任务。 ## 1. 构建带返回结果的异步任务 当处理异步任务时,一个常见的挑战是不知道任务何时结束,如何返回结果。以下是实现此功能的步骤: 1. **添加依赖**: ```xml <dependency> <groupId>javax</group

收集用户反馈与容器技术:软件开发的关键要素

# 收集用户反馈与容器技术:软件开发的关键要素 ## 1. 收集用户反馈 ### 1.1 情感分析 除了在产品内收集指标外,还可以从产品外部收集指标。Twitter 就是一个信息来源,借助 Azure 云与机器学习算法,现在能够持续分析指向特定 Twitter 账号或话题标签的所有推文,并自动检测突然变化。甚至有一个 Azure Pipelines 扩展,它可以持续测量 Twitter 上的情感倾向,若情感倾向过于负面,就会取消发布到下一阶段的进程。这个扩展以管道门的形式实现,可在 Azure DevOps 市场获取。 ### 1.2 支持请求 和 Twitter 情感分析类似,可能还有其