进度条可了解 shell 脚本已完成多少输出

进度条可了解 shell 脚本已完成多少输出

我有以下 shell 脚本清理脚本的输出,使其降序,给出包名称并干净地存在-

┌─[shirish@debian] - [~] - [6348]
└─[$] cat find-interesting-patches.sh 

for source in $(dpkg-query --show -f \
 '${source:Package}\n' | sort -u); do bts \
 select source:${source} tag:patch \
| sed  "s/^/${source} /g"; done 

我在标准输出上得到输出。

┌─[shirish@debian] - [~] - [6349]
└─[$]./find-interesting-patches.sh

2048-qt 781691
abootimg 725728
accountsservice 805989
acl 677570
acpi 772688
acpi-support 823072
acr 772194

现在我知道包的数量是有限的,例如它是 4k 以及更多一点

$dpkg -l > dpkg-l.txt

进而

$wc dpkg-l.txt 

它给出了行号、整个 she-bang 的字数。

当我运行脚本时,有没有办法有一个进度条,这样我就知道它已经完成了多少。我在看https://stackoverflow.com/questions/238073/how-to-add-a-progress-bar-to-a-shell-script#238094并尝试了一些方法,但没有成功。例如,我尝试了 pv,但它失败得很厉害 -

┌─[shirish@debian] - [~] - [6353]
└─[$] pv ./find-interesting-patches.sh

for source in $(dpkg-query --show -f \
 '${source:Package}\n' | sort -u); do bts \
 select source:${source} tag:patch \
| sed  "s/^/${source} /g"; done 
 153 B 0:00:00 [9.09KiB/s] [=================================================================================================>] 100% 

不是我所期待的,有人知道我做错了什么吗?

答案1

当你给予pv一个文件作为命令行参数,它的作用类似于cat并显示该文件,并跟踪该输出的进度,这就是您所看到的。如果您pv要将文件提供给缓慢的进程(使用管道),则该形式非常有用;联机帮助页有示例。

您可能会考虑保存输出

dpkg-query --show -f '${source:Package}\n' | sort -u

到一个文件并使用pv将其提供给循环调用bts select,但生成的文件太短,以至于它被缓冲并pv认为它在处理实际开始之前已被处理。

所以你需要手动跟踪进度:

#!/bin/sh
file=$(mktemp)
dpkg-query --show -f '${source:Package}\n' | sort -u > ${file}
lines=$(wc -l ${file} | cut -f1 -d\ )
line=0
while read source; do
    line=$((line + 1))
    printf "Processing line %d / %d\r" ${line} ${lines} >&2
    bts select source:${source} tag:patch | sed "s/^/${source} /g"
done < ${file} | sort -k2,2n -r
rm ${file}
echo "Done                           " >&2

我将让您调整它以使用一个漂亮的进度条,使用中的示例如何在shell脚本中添加进度条?

答案2

如果你对命令计时,你可以使用这个进度条

使用它会很顺利半块字符

例子

在此输入图像描述

另一个并不总是可用的选项是不根据时间更新进度条,而是根据脚本的某些点更新进度条。

code set_progress 10 code set_progress 20 ... code set_progress 100

相关内容