在bash或* NIX中的任何其餘shell中編寫腳本時,在運行將花費幾秒鐘的命令的同時,須要一個進度條。 mysql
例如,複製一個大文件,打開一個大tar文件。 git
您建議採用什麼方式將進度條添加到Shell腳本? github
這使您能夠看到命令仍在執行: 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
這僅適用於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
大多數Unix命令不會爲您提供直接反饋,您能夠從中進行此操做。 有些會在您能夠使用的stdout或stderr上提供輸出。 oop
對於諸如tar之類的東西,您能夠使用-v開關並將輸出經過管道傳輸到程序,該程序會爲讀取的每一行更新一個小動畫。 當tar寫出文件列表時,它會被解散,程序能夠更新動畫。 要完成百分比,您將必須知道文件數量並計算行數。 動畫
就我所知,cp不會提供此類輸出。 要監視cp的進度,您必須監視源文件和目標文件,並觀察目標的大小。 您能夠使用stat(2)系統調用編寫一個小的c程序來獲取文件大小。 這將讀取源的大小,而後輪詢目標文件,並根據迄今爲止寫入的文件大小更新完成百分比。 spa
您能夠經過覆蓋一行來實現。 使用\\r
返回到行的開頭,而無需將\\n
寫入終端。
完成後,輸入\\n
。
使用echo -ne
能夠:
\\n
和 \\r
類的轉義序列。 這是一個演示:
echo -ne '##### (33%)\r' sleep 1 echo -ne '############# (66%)\r' sleep 1 echo -ne '####################### (100%)\r' echo -ne '\n'
在下面的評論中,puk提到「失敗」,若是您從長行開始而後想寫一條短行:在這種狀況下,您將須要覆蓋長行的長度(例如,帶空格)。
一些帖子顯示瞭如何顯示命令的進度。 爲了計算它,您須要查看進度。 在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腳本的早期版本。