如何將進度條添加到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腳本的早期版本。

相關文章
相關標籤/搜索