我希望终端显示某种基于时间的进程条,例如每 60 秒显示 1%。
答案1
在 bash 中创建进度条列出了获取进度条的方法,所以我将集中讨论如何伪造部分。我将使用 2 秒而不是您这里的 60 秒,仅用于测试,请sleep
根据您的确切需求调整该值。
使用dialog
、whiptail
或zenity
(GUI)
for i in {1..100}; do sleep 2; echo $i; done | dialog --gauge 'Running...' 6 60 0
此for
循环每秒循环1 次,遍历 1 到 100 的数字,然后将输出通过管道传输到,后者将数字显示为进度条上的进度。此方法也适用于和(GUI)。的输出如下所示,在文本模式下使用“curses”显示彩色进度条:echo
2
dialog
whiptail
zenity --progress
dialog
使用pv
for i in {1..100}; do sleep 2; echo; done | pv -pWs100 >/dev/null
这个循环非常相似,只是它每秒只打印一个换行符(=1 字节数据)2
,pv
然后被告知需要精确的100
字节数据并显示p
进度条。在宽度为 80 个字符的终端窗口中,输出如下所示:
[===============> ] 22%
构建你自己的进度条
使用简单的循环,您还可以构建自己的进度条。以下是一些示例,#
每 2 秒打印一行,每次打印 100:
# number signs only
$ for i in {1..100}; do sleep 2; echo -n \#; done; echo
####################################################################################################
# with progress in % on the right
$ for i in {1..100}; do sleep 2; printf "%0.s#" $(seq 1 $i); printf "%0.s " $(seq $i 100); printf "%3d%%\r" "$i"; done; echo
###################################################### 54%
# with progress in % on the left
$ for i in {1..100}; do sleep 2; printf "%3d%% " "$i"; printf "%0.s#" $(seq 1 $i); printf "%0.s " $(seq $i 100); printf "\r"; done; echo
39% #######################################
1看,一个多肉植物!
答案2
假进度条
此进度条使用/bin
每个人都有的目录中的真实数据。脚本可以“简化”以满足您的虚假需求。或者可以将其扩展为实际应用程序:
它使用的是终端中默认 GUIyad
的增强版本。要安装,请使用:zenity
yad
sudo apt install yad
代码如下:
#!/bin/bash
# NAME: yad-progress-bar
# PATH: /mnt/e/bin
# DESC: Display yad progress bar % with names.
# DATE: Apr 23, 2018. Modified Oct 18, 2019.
Source="/bin"
Title="Processing files for: $Source"
Count=0
AllFiles=$(ls $Source/* | wc -l)
for f in "$Source"/* ; do
echo "#$f" # Display file name in progress bar.
Count=$(( $Count + 1 ))
Percent=$(( Count * 100 / AllFiles ))
echo $Percent # Display percent complete in progress bar.
sleep .025
done | yad --progress --auto-close \
--width=500 --height=300 \
--title="$Title" --enable-log "Current filename" \
--log-expanded --log-height=250 \
--log-on-top --percentage=0 \
--no-cancel --center
答案3
采纳@wjandream 的评论并仅使用 for i in {1..100},第三个选项简化为:
for ((i=0; i<=100; i++)); { echo "$i"; echo "# 正在下载 $i%";sleep 0.2; } | yad --progress --title="正在下载..." --height=90 --width=400 --center --text="请等待..." --auto-close --no-buttons --no-escape