Linux终端进度条显示进程执行进度

2023-05-16

  在Linux执行费时操作(如tar)时显示进度条,以不至于让用户觉得程序卡死了。

效果

文本进度条

在这里插入图片描述
  结束后:
在这里插入图片描述

图形化字符进度条

在这里插入图片描述

文本进度条怎么做

进度条实现

  网上有一些老六会说要下载一些工具,如:pv。这就很不优雅(当你的脚本要给人做安装包的时候,你自己就是安装包,你还要求别人先装一些工具才能看进度条,是不是很不优雅),我懒得搞这种,有这闲功夫不如自己整一个,反正也没几行代码。
  老规矩,来最简单的,shell代码(这里绝对相信用户输入,所以不做参数校验。好吧其实是我懒得校验):

#!/bin/bash

# 打印进度条
# 参数1 label	标签,显示在最左边
# 参数2 current	当前进度,0~100的整数
# 参数3 tip		提示信息,显示在最右边(默认为当前进度)
# 参数4 length	进度条长度,整数,字符个数(默认为50)
# 参数5 chr		填充字符,进度条填充用(默认为=)
# 显示如:
# label[========             ]tip
print_gauge()
{
	local label=$1					# 标签,显示在最左边
	local current=$2				# 当前进度,0~100的整数
	local tip=${3:-" $current%%"}	# 提示信息,显示在最右边(默认为当前进度)
	local length=${4:-50}			# 进度条长度,整数,字符个数(默认为50)
	local chr=${5:-=}				# 填充字符,进度条填充用(默认为=)

	local cur_chr_n=$((current * length / 100))
	printf "\r${label}["
	local i
	for ((i = 0; i < cur_chr_n; i++)); do
		printf "$chr"
	done
	for ((i = cur_chr_n; i < length; i++)); do
		printf " "
	done
	printf "]${tip}"
}

# 读入标准输入的方式统计进度条
# 参数1 label		标签,显示在最左边
# 参数2 size			标准输入流总大小
# 参数3 over_tip		结束时的提示(默认为100%)
# 参数4 length		进度条长度,整数,字符个数(默认为50)
# 参数5 chr			填充字符,进度条填充用(默认为=)
dd_gauge()
{
	local label=$1					# 标签,显示在最左边
	local size=$2					# 标准输入流总大小
	local over_tip=${3:-" 100%%"}	# 结束时的提示(默认为100%)
	local length=${4:-50}			# 进度条长度,整数,字符个数(默认为50)
	local chr=${5:-=}				# 填充字符,进度条填充用(默认为=)

	local count=0
	local current
	local tip=""
	while ((count < size)); do
		dd bs=512 count=10000 2>/dev/null
		((count += 5120000))
		((current = count * 100 / size))
		((current > 100)) && current=100
		[ "$current" == "100" ] && tip=$over_tip
		print_gauge "$label" "$current" "$tip" "$length" "$chr" >&2
	done
	echo >&2
}
# 对dd_gauge封装一层,自动计算文件大小
# 参数1 label		标签,显示在最左边
# 参数2 filename		文件名
# 参数3 over_tip		结束时的提示(默认为100%)
# 参数4 length		进度条长度,整数,字符个数(默认为50)
# 参数5 chr			填充字符,进度条填充用(默认为=)
dd_gauge_from_file()
{
	local label=$1					# 标签,显示在最左边
	local filename=$2				# 文件名
	local over_tip=${3:-" 100%%"}	# 结束时的提示(默认为100%)
	local length=${4:-50}			# 进度条长度,整数,字符个数(默认为50)
	local chr=${5:-=}				# 填充字符,进度条填充用(默认为=)

	local size=$(stat -c %s -- "$filename")
	dd_gauge "$label" "$size" "$over_tip" "$length" "$chr" <"$filename"
}

# 读入标准输入的方式按需求显示进度条
# 参数1 label		标签,显示在最左边
# 参数2 over_tip		结束时的提示(默认为当前进度)
# 参数3 length		进度条长度,整数,字符个数(默认为50)
# 参数4 chr			填充字符,进度条填充用(默认为=)
show_gauge()
{
	local label=$1			# 标签,显示在最左边
	local over_tip=$2		# 结束时的提示(默认为当前进度)
	local length=${3:-50}	# 进度条长度,整数,字符个数(默认为50)
	local chr=${4:-=}		# 填充字符,进度条填充用(默认为=)

	local current
	local tmp
	while read current; do
		tmp=$current
		print_gauge "$label" "$current" "" "$length" "$chr" >&2
	done
	print_gauge "$label" "$tmp" "$over_tip" "$length" "$chr" >&2
	echo >&2
}

进度条调用

  假设上一节进度条实现的shell代码保存为gauge.sh

如果是读取文件操作的(如计算md5或者解压tar之类的操作)

# 这里演示计算md5的,假设要计算md5的文件为xxx
. gauge.sh
dd_gauge_from_file "计算md5进度: " "xxx" "计算完毕" | md5sum

  效果:
在这里插入图片描述
  计算完毕后:
在这里插入图片描述
  实际上 dd_gauge_from_file a b c d e 等价于 dd_gauge a $(stat -c %s b) c d e <b

如果是读取输出流的(如三剑客解析后再用其他工具解析之类的操作)

# 这里演示从简,假设就是计算dd后的md5
. gauge.sh
dd if=/dev/zero bs=1M count=1000 2>/dev/null | dd_gauge "dd zero md5: " "$((1024 * 1024 * 1000))" | md5sum

在这里插入图片描述

如果是自定义进度的(如一系列操作,到哪步规定是20%,哪步规定的50%之类的)

# 这里演示从简,就随便打打进度
. gauge.sh
(echo 0; sleep 10; echo 20; sleep 10; echo 50; sleep 10; echo 90; sleep 10; echo 100) | show_gauge "自定义进度: "

  实际上你要自定义进度的操作应该是类似这样的:

. gauge.sh
(
	# 做一些创建配置的操作
	create_config	# Linux里面没有这个命令的,这只是假设你做创建配置的操作
	echo 10			# 配置创建好了,可以认为进度到 10% 了,这些都是可以自定义的

	# 做一些复制文件的操作
	do_copy_file
	echo 50			# 文件复制完了,可以认为进度到 50% 了

	# 创建一些软链接
	do_create_link
	echo 100 
) | show_gauge "进度: "

图形化字符进度条怎么做

  这个其实老简单了,直接用现成的whiptail或者dialog。
  一般来说,标准centos(即使是最简安装)都会自带whiptail工具,而ubuntu有些分支版本可能自带的是dialog(从而没有自带whiptail)。所幸,whiptail和dialog的用法差不多,所以可以这样:

my_dialog()
{
	DIALOG=""
	type whiptail >/dev/null 2>&1 && DIALOG="whiptail"
	type dialog >/dev/null 2>&1 && DIALOG="dialog"

	[ -n "$DIALOG" ] && "$DIALOG" "$@"
}

给代码加点保护措施。
  dialog显示进度条的方法为:

(
	do_something
	echo 10		# 进度可自定义
	do_something
	echo 20		# 进度可自定义
	...
	echo 100	# 进度可自定义,最后没到 100% 也可以
) | dialog --gauge 进度 0 50 0
# 其中dialog第一个参数为类型,--gauge就表示进度条显示的东西
# 如果第一个参数为--gauge则:
# 第二个参数为显示的内容
# 第三个参数为高度,0表示自适应
# 第四个参数为宽度
# 第五个参数为初始进度
# whiptail对进度条而言,参数和dialog差不多
# 如果不确定环境上有dialog还是whiptail,可以用保护措施,用my_dialog
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux终端进度条显示进程执行进度 的相关文章

  • Python hex()十六进制转换

    Python hex 函数用于将整数转换为以 0x 为前缀的小写十六进制字符串 xff1a print hex 255 decimal十进制 print hex 0b111 binary二进制 print hex 0o77 octal八进制
  • rocksdb的原子flush

    如果始终启用 WAL xff0c 则无需使用原子刷新选项 启用 WAL 后 xff0c 单个 WAL 文件用于捕获对所有列族的写入 因此 xff0c 恢复的数据库 xff08 通过在崩溃 恢复路径中重播 WAL 日志 xff09 保证在所有
  • rocksdb的设置选项和基本调整

    除了在 RocksDB 上使用基本操作编写代码外 xff0c 您可能还对如何调整 RocksDB 以实现所需的性能感兴趣 在本页中 xff0c 我们将介绍如何进行初始设置 xff0c 该设置应该足以满足许多用例的需求 RocksDB 有许多
  • rocksdb的wal配置

    wal配置 数据库 xff1a xff1a wal dir DBOptions wal dir设置 RocksDB 存储预写日志文件的目录 xff0c 该目录允许将 WAL 存储在与实际数据不同的目录中 数据库 xff1a xff1a WA
  • Winpcap常用函数解析

    1 int pcap findalldevs pcap if t char 说明 xff1a 用来获得网卡的列表 参数 xff1a 指向pcap if t 类型的列表的指针的指针 char型指针 当打开列表错误时返回错误信息 返回值 为in
  • 终端、虚拟终端、shell、控制台、tty的区别

    终端与控制台的区别 xff1f 最近开始接触Linux xff0c 终端 虚拟终端 shell 控制台 tty等概念让我很混乱 xff0c 有必要认识清楚 今天看到有人问终端和控制台的区别 xff0c 而且这个问题比较有普遍性 xff0c
  • Windows下C++使用thread时无法识别thread和mutex相关库的解决

    问题描述 今天我在Windows下打算尝试C 43 43 多线程编程 xff0c 在CLion上进行编码 CLion的C 43 43 编译器是正常的 xff0c 以前也跑过好几个项目 xff0c 使用其他STL库函数也正常 xff0c 唯独
  • 虚拟机下Linux系统磁盘扩容

    在VM虚拟机中 xff0c 我们经常会选择默认磁盘大小20G xff0c 用着用着才发现20G不够用 xff0c 服务启动不了 xff0c 就很尴尬 xff0c 让我们今天一起来学习下 xff0c 如何在虚拟机给磁盘扩容 一 xff1a 关
  • MATLAB学习笔记——二维和三维绘图

    MATLAB学习笔记 二维和三维绘图 近期练习matlab的二维和三维绘图 xff0c 整理一下 xff0c 以防忘记 文章目录 MATLAB学习笔记 二维和三维绘图一 二维绘图1 plot命令2 fplot 命令3 ezplot 绘图命令
  • pve 相关

    一 pve 创建的虚拟机的配置文件位置 在宿主机的 etc pve qemu server xff0c 这里有创建虚拟机的相关硬件信息 root 64 pve span class token comment cd etc pve qemu
  • mysql在linux下的my.cnf文件在哪里!

    用rpm包安装的MySQL是不会安装 etc my cnf文件的 xff0c 至于为什么没有这个文件而MySQL却也能正常启动和作用 xff0c 在点有两个说法 xff0c 第一种说法 xff0c my cnf只是MySQL启动时的一个参数
  • shell后台并发执行的最佳实践

    一 shell如何在后台执行 1 nohup命令 通常我们都是远程登录linux终端 xff0c 而当我们退出终端时在之前终端运行的程序都会终止 xff0c 有时候先想要退出终端也要程序继续执行这时nohup就登场了 nohup命令 可以将
  • 任意输入10个数,找出最大数和最小数。

    任意输入10个数 找出最大数和最小数 span class token macro property span class token directive keyword include span span class token stri
  • 如何在 Chromebook 上启用开发者模式

    写在前面的话 xff1a 版权声明 xff1a 本文为博主原创文章 xff0c 转载请注明出处 xff01 博主是一个小菜鸟 xff0c 并且非常玻璃心 xff01 如果文中有什么问题 xff0c 请友好地指出来 xff0c 博主查证后会进
  • 【C语言】实现 atoi 函数

    写在前面的话 xff1a 版权声明 xff1a 本文为博主原创文章 xff0c 转载请注明出处 xff01 博主是一个小菜鸟 xff0c 并且非常玻璃心 xff01 如果文中有什么问题 xff0c 请友好地指出来 xff0c 博主查证后会进
  • 【C语言】字符串合集

    写在前面的话 xff1a 版权声明 xff1a 本文为博主原创文章 xff0c 转载请注明出处 xff01 博主是一个小菜鸟 xff0c 并且非常玻璃心 xff01 如果文中有什么问题 xff0c 请友好地指出来 xff0c 博主查证后会进
  • 线程上下文切换和进程上下文切换的区别

    进程切换分两步 1 切换页目录以使用新的地址空间 2 切换内核栈和硬件上下文 对于linux来说 xff0c 线程和进程的最大区别就在于地址空间 对于线程切换 xff0c 第1步是不需要做的 xff0c 第2是进程和线程切换都要做的 所以明
  • 【Ubuntu】解决 Could not get lock /var/lib/dpkg/lock-frontend

    写在前面的话 xff1a 版权声明 xff1a 本文为博主原创文章 xff0c 转载请注明出处 xff01 博主是一个小菜鸟 xff0c 并且非常玻璃心 xff01 如果文中有什么问题 xff0c 请友好地指出来 xff0c 博主查证后会进
  • 【Ubuntu】解决 error: dpkg frontend is locked by another process

    写在前面的话 xff1a 版权声明 xff1a 本文为博主原创文章 xff0c 转载请注明出处 xff01 博主是一个小菜鸟 xff0c 并且非常玻璃心 xff01 如果文中有什么问题 xff0c 请友好地指出来 xff0c 博主查证后会进
  • 【OpenCV】关于Vec3b类型的含义与使用

    写在前面的话 xff1a 版权声明 xff1a 本文为博主原创文章 xff0c 转载请注明出处 xff01 博主是一个小菜鸟 xff0c 并且非常玻璃心 xff01 如果文中有什么问题 xff0c 请友好地指出来 xff0c 博主查证后会进

随机推荐

  • 【Java】文件读写和输入输出

    写在前面的话 xff1a 版权声明 xff1a 本文为博主原创文章 xff0c 转载请注明出处 xff01 博主是一个小菜鸟 xff0c 并且非常玻璃心 xff01 如果文中有什么问题 xff0c 请友好地指出来 xff0c 博主查证后会进
  • 【剑指Offer】题3:数组中重复的数字

    写在前面的话 xff1a 版权声明 xff1a 本文为博主原创文章 xff0c 转载请注明出处 xff01 博主是一个小菜鸟 xff0c 并且非常玻璃心 xff01 如果文中有什么问题 xff0c 请友好地指出来 xff0c 博主查证后会进
  • 【C语言】关于遍历字符串的三种方法

    写在前面的话 xff1a 1 版权声明 xff1a 本文为博主原创文章 xff0c 转载请注明出处 xff01 2 博主是一个小菜鸟 xff0c 并且非常玻璃心 xff01 如果文中有什么问题 xff0c 请友好地指出来 xff0c 博主查
  • 逻辑地址、虚拟地址、物理地址以及内存管理

    本文涉及的硬件平台是X86 xff0c 如果是其它平台 xff0c 嘻嘻 xff0c 不保证能一一对号入座 xff0c 但是举一反三 xff0c 我想是完全可行的 1 概念 物理地址 physical address 用于内存芯片级的单元寻
  • 为 CentOS 配置网络

    用桥接方式给CentOS配置网络 xff0c 这里我使用的是CentOS 6 5 第一步 点开虚拟机的设置 xff0c 网络连接选择桥接方式 xff0c 其他勾选按照下图 xff0c 如下图做相关的设置 xff1a 第二步 打开网络连接 x
  • 32位 idea启动出现“could not find main class com/intellij/idea/Main“错误解决方法

    idea启动出现 could not find main class com intellij idea Main 错误的解决方法 32位环境下安装idea及解决could not find main class com intellij
  • java实现获取两个list交集

    如何获取两个list的交集 xff0c 使用java8 的stream实现非常容易 java流实现 创建两个字符串list xff0c 两者都有重复的元素 xff1a List lt String gt list 61 Arrays asL
  • shell中$(( ))与$( )还有${ }的区别

    与 96 96 反引号 在bash shell中 xff0c 与 96 96 反引号 都是用来做命令替换 command substitution 用的 echo the last sunday is date d 34 last sund
  • apache 的网页内容显示是乱码

    apache 的网页内容显示是乱码 非常感觉下面各位的回答 xff0c http forum ubuntu org cn yaoms etcte HuntXu sevk shellex http linux chinaunix net ma
  • 字母及数字上标下标

    字母及数字上标下标 欢迎使用新的改变 欢迎使用 常用上标 常用下标 更多上标
  • 构造矩阵乘最优解

    void bracket int i int j if i 61 61 j cout lt lt 34 M 34 lt lt i else cout lt lt 34 34 int k 61 K i j bracket i k 1 brac
  • vs2012 出现LINK : fatal error LNK1104: 无法打开文件“kernel32.lib”问题

    首先 xff0c 我是在已经安装了vs2010的基础上安装的vs2012 xff0c 测试安装的时候发现最基本的helloworld程序都通不过 xff0c 出现LINK fatal error LNK1104 无法打开文件 kernel3
  • SerDes知识详解

    一 SERDES的作用 1 1并行总线接口 在 SerDes流行之前 芯片之间的互联通过 系统同步或者源同步的并行接口传输数据 图 1 1 演示了系统和源同步并行接口 随着接口频率的提高 xff0c 在系统同步接口方式中 有几个因素限制了有
  • enum : C#中的枚举类型,原来有这么多用法

    今天来的时候打开了MSDN扫了一眼C 里的枚举类型 蓦然发现这东西还有些新玩法 首先是简单介绍 xff0c 在此略过 因为enum用法很简单么 定义一个简单的枚举类型 xff1a enum Days Sat Sun Mon Tue Wed
  • ubuntu下安装cuDNN

    正确的安装cuDNN方式 xff0c 其实跟着官方安装说明进行安装就可以了 1 从https developer nvidia com cudnn上下载cudnn相应版本的压缩包 xff08 需要注册或登录 xff09 下载cuda对应版本
  • 面向对象(3)

    私有权限 封装的意义 xff1a 将属性和方法放到一起做为一个整体 xff0c 然后通过实例化对象来处理 xff1b 隐藏内部实现细节 xff0c 只需要和对象及其属性和方法交互就可以了 xff1b 对类的属性和方法增加 访问权限控制 私有
  • 【vnc远程桌面】未联网状态下使用离线包配置vnc

    系统为ubuntu18 04 amd64版本 本教程使用vino配置远程服务器 首先 xff0c 离线安装vino包后远程传输给待控制服务器 xff1a sudo apt update sudo apt get download apt c
  • 7.用选择排序法对一个数组进行排序。

    include lt stdio h gt define N 5 void datesort int a int i j k temp for i 61 0 i lt N 1 i 43 43 k 61 i for j 61 i 43 1 j
  • error while loading shared libraries: xxx.so.x"错误的原因和解决办法

    一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误 比如 tmux error while loading shared libraries libevent 1 4 so 2 cannot open shared o
  • Linux终端进度条显示进程执行进度

    在Linux执行费时操作 xff08 如tar xff09 时显示进度条 xff0c 以不至于让用户觉得程序卡死了 效果 文本进度条 结束后 xff1a 图形化字符进度条 文本进度条怎么做 进度条实现 网上有一些老六会说要下载一些工具 xf