如何创建假进程栏?

Gra*_*nda 4 command-line

我希望终端根据时间显示某种进程栏,例如每 60 秒显示 1%。

des*_*ert 7

在 bash列表中创建进度条以获取进度条的方法,因此我将在这里集中讨论如何伪造部分。我将在这里使用 2 秒而不是 60 秒来进行测试,sleep根据您的确切需求调整值。

使用dialog,whiptailzenity(GUI)

for i in {1..100}; do sleep 2; echo $i; done | dialog --gauge 'Running...' 6 60 0
Run Code Online (Sandbox Code Playgroud)

这个for循环在数字 1 到 100 上循环1并且echo每秒循环一次2,然后输出通过管道传输到dialog,它在进度条上显示数字作为进度。这种方法也适用于whiptailzenity --progress(GUI)。dialog的输出看起来像这样,在文本模式下使用 'curses' 带有彩色进度条:

对话进度条

使用 pv

for i in {1..100}; do sleep 2; echo; done | pv -pWs100 >/dev/null
Run Code Online (Sandbox Code Playgroud)

这个循环非常相似,只是它每秒钟只打印一个换行符(=1 个字节的数据)2pv然后被告知期望精确100的数据字节并显示一个p进度条。在宽度为 80 个字符的终端窗口中,输出如下所示:

[===============>                                                          ] 22%
Run Code Online (Sandbox Code Playgroud)

构建自己的进度条

通过一个简单的循环,您还可以构建自己的进度条。以下是一些示例,它们#在一行中打印 100 ,每 2 秒打印一个:

# 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% ####################################### 
Run Code Online (Sandbox Code Playgroud)

1看,多胞胎