问:
在 *NIX 系统的 Bash 或其他 shell 脚本中,当运行的命令需要耗费几秒钟以上的时间时,需要一个进度条。
比如,复制一个大文件,打开一个大的 tar 文件。
你建议用什么方法在 shell 脚本中添加进度条?
答:
根据题主所问,我推荐以下几种方式:
1. pv 命令:pv 是 "pipe viewer" 的缩写,可以监视通过管道传输数据的进度。如果要传输/压缩/解压缩大文件,可以使用 pv 来显示进度条。例如:
代码语言:javascript复制pv -pbt bigfile | nc -nv somewhere.com 5000
pv file.tar | gzip > file.tar.gz
使用 nc 命令测试传输文件的截图:
2. rsync 命令:如果你正在同步文件,rsync 提供了内置的进度展示功能,可以使用 --progress 选项来显示文件的同步进度。例如:
3. 自定义进度条:在某些情况下,你可能需要直接在脚本中编写代码来显示进度条。这通常涉及到在循环中使用 printf 命令来输出进度条,然后用 carriage return (r) 来覆盖同一行的内容,从而创建进度条的动态效果。例如以下示例代码:
代码语言:javascript复制#! /bin/bash
total_steps=100
for ((step=1; step<=total_steps; step )); do
printf "rProgress: [%-50s] %d%%" $(printf "#%.0s" $(seq 1 $((step*50/total_steps)))) "$((step*100/total_steps))"
sleep 0.1 # 模拟操作延迟
done
printf "n"
参考文档:
- stackoverflow question 238073
- man pv
- man rsync