如何将进度条添加到Shell脚本?

在bash或* NIX中的任何其余shell中编写脚本时,在运行将花费几秒钟的命令的同时,须要一个进度条。 mysql

例如,复制一个大文件,打开一个大tar文件。 git

您建议采用什么方式将进度条添加到Shell脚本? github


#1楼

这使您能够看到命令仍在执行: sql

while :;do echo -n .;sleep 1;done &
trap "kill $!" EXIT  #Die with parent if we die prematurely
tar zxf packages.tar.gz; # or any other command here
kill $! && trap " " EXIT #Kill the loop and unset the trap or else the pid might get reassigned and we might end up killing a completely different process

这将建立一个无限的while循环 ,该循环在后台执行并回显 “”。 每一秒。 这将显示. 在外壳中。 运行tar命令或所需的任何命令。 当该命令执行完毕后, 杀死在后台运行的最后一个做业-这是无限的while循环shell


#2楼

这仅适用于gnome zenity。 Zenity为bash脚本提供了一个很棒的本机界面: https ://help.gnome.org/users/zenity/stable/ bash

从Zenity Progress Bar示例中: ide

#!/bin/sh
(
echo "10" ; sleep 1
echo "# Updating mail logs" ; sleep 1
echo "20" ; sleep 1
echo "# Resetting cron jobs" ; sleep 1
echo "50" ; sleep 1
echo "This line will just be ignored" ; sleep 1
echo "75" ; sleep 1
echo "# Rebooting system" ; sleep 1
echo "100" ; sleep 1
) |
zenity --progress \
  --title="Update System Logs" \
  --text="Scanning mail logs..." \
  --percentage=0

if [ "$?" = -1 ] ; then
        zenity --error \
          --text="Update canceled."
fi

#3楼

大多数Unix命令不会为您提供直接反馈,您能够从中进行此操做。 有些会在您能够使用的stdout或stderr上提供输出。 oop

对于诸如tar之类的东西,您能够使用-v开关并将输出经过管道传输到程序,该程序会为读取的每一行更新一个小动画。 当tar写出文件列表时,它会被解散,程序能够更新动画。 要完成百分比,您将必须知道文件数量并计算行数。 动画

就我所知,cp不会提供此类输出。 要监视cp的进度,您必须监视源文件和目标文件,并观察目标的大小。 您能够使用stat(2)系统调用编写一个小的c程序来获取文件大小。 这将读取源的大小,而后轮询目标文件,并根据迄今为止写入的文件大小更新完成百分比。 spa


#4楼

您能够经过覆盖一行来实现。 使用\\r返回到行的开头,而无需将\\n写入终端。

完成后,输入\\n

使用echo -ne能够:

  1. 不打印\\n
  2. 识别\\r类的转义序列。

这是一个演示:

echo -ne '#####                     (33%)\r'
sleep 1
echo -ne '#############             (66%)\r'
sleep 1
echo -ne '#######################   (100%)\r'
echo -ne '\n'

在下面的评论中,puk提到“失败”,若是您从长行开始而后想写一条短行:在这种状况下,您将须要覆盖长行的长度(例如,带空格)。


#5楼

一些帖子显示了如何显示命令的进度。 为了计算它,您须要查看进度。 在BSD系统上,某些命令(例如dd(1))接受SIGINFO信号,并将报告其进度。 在Linux系统上,某些命令将对SIGUSR1作出相似的响应。 若是能够使用此功能,则能够经过dd输入输入,以监视处理的字节数。

或者,您能够使用lsof获取文件的读取指针的偏移量,从而计算进度。 我编写了一个名为pmonitor的命令,该命令显示了处理指定进程或文件的进度。 使用它,您能够执行如下操做。

$ pmonitor -c gzip
/home/dds/data/mysql-2015-04-01.sql.gz 58.06%

个人博客中显示了Linux和FreeBSD Shell脚本的早期版本。

相关文章
相关标签/搜索