我有以下 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脚本中添加进度条?。