如何在shell脚本中添加进度条

2024-02-27 13:05:43 浏览数 (2)

问:

在 *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

0 人点赞