2016-12-18 173 views
0

我正在編寫一個bash腳本,它執行一些東西的安裝。從腳本內部運行命令時的Bash進度條

我不希望用戶看到命令及其輸出,所以我會使用2>&1重定向它們。

我不希望打印爲其安裝完每個部分的進度條,並根據成功/失敗的消息,如果有錯誤,例如:

Installing OpenCv ..................... [Success] 
Installing Qt  ..................... [Failed] 

這裏是我的代碼:

#!/bin/bash 

installOf="Installing OpenCv " 

function printProgressBar() 
{ 
    local progressBar="." 
    printf "%s" "${progressBar}" 
} 

function InstEssent 
{ 
    sudo apt-get -y install build-essential 
    sleep 5 
    echo "Done" 
} 

printf "%s" "${installOf}" 

InstEssent & 

while [ "${InstEssent}" != "Done" ] 
do 
    printProgressBar 
    sleep 1 
done 

installStatus="Success" 
printf " [%s]\n" "${installStatus}" 
+0

我相信你在其他地方看到過這個,所以你爲什麼不認爲這可能? –

+0

你的代碼在哪裏? –

+0

@Inian:對不起,我生病了,沒有時間研究它。現在這樣做,很快就會更新,對不起。 – Idanis

回答

1

好吧,因此在bash或其他我可以知道的shell中沒有本地工具,但是您可以使用下面的這個printf &這個自定義函數來實現你所需要的。這個小片段將打印安裝進度條,您可以通過正常功能調用printProgressBar在您想要顯示的腳本的各個位置進行打印。

function printProgressBar() { 
    local progressBar="." 
    printf "%s" "${progressBar}" 
} 

假設你在你的函數調用n步驟,在插入之間的地方調用這個函數。是否有錯誤消息的實際打印,填寫可變installOf安裝頭從您的示例假設可採取任一"Installing OpenCv "(或)"Installing Qt ",步驟之前用它在該變量作爲

installOf="Installing OpenCv " 
printf "%s" "${installOf}" 

和最終狀態,因爲你沒有讓我們知道你如何讓安裝的整體狀態,假設你找到它,這取決於成功或失敗,還更新了它另一個變量

installStatus="Success" 
printf " [%s]\n" "${installStatus}" 

所以把他們放在一起,我有這個運行20個調用函數的簡單while循環,可以使用a類似的方式來採取您的腳本中的各個位置的函數調用。

installOf="Installing OpenCv " 

function printProgressBar() { 
    local progressBar="." 
    printf "%s" "${progressBar}" 
} 

printf "%s" "${installOf}" 

while ((cnt < 20)) 
do 
    ((cnt++)) 
    printProgressBar 
    sleep 1 
done 

# You can determine the status of your installation as your script demands 

installStatus="Success" 
printf " [%s]\n" "${installStatus}" 

運行腳本產生類似於您的要求的結果的東西,

$ bash script.sh 
Installing OpenCv .................... [Success] 

觀察到,每個.代表一個函數調用的每個實例。

更新: -

看你的代碼邏輯,你缺少的後臺作業是如何工作的一個點。您的後臺功能InstEssent正在安裝某個模塊。要有效地使用進度欄,您需要不斷輪詢後臺作業以查看它是否仍在使用kill -0 "$pid"命令運行,如果它正在運行,請按照下面的代碼所示打印安裝欄。

function InstEssent() 
{ 
    sudo apt-get -y install build-essential 
    sleep 5 
} 

printf "%s" "${installOf}" 

InstEssent & 
pid_InstEssent="$!" 

while kill -0 "$pid" 2> /dev/null 
do 
    printProgressBar 
    sleep 1 
done 
+0

我試圖實現你的解決方案。點的打印效果很好。但是,似乎我不能從一個函數內改變一個全局變量。那是對的嗎?我希望我的函數能夠根據安裝進度更改「停止」變量以指示進度條停止。 – Idanis

+0

@Idanis:感謝您嘗試一下我的邏輯,您能解釋一下您用一些實際代碼看到的問題嗎?看起來有點微不足道。可能是這個頁面可以幫助你分類你遇到的問題,http://stackoverflow.com/questions/23564995/how-to-modify-a-global-variable-within-a-function-in-bash – Inian

+0

感謝你的回覆。我上面更新了我的代碼。當我運行這段代碼時,根本沒有看到任何點,函數完成其運行,打印出「完成」,然後腳本退出並顯示「成功」消息。以下是我想要實現的:我試圖在「後臺」中運行此功能並打印點直到完成。完成後,我希望打印成功/失敗消息。我在這裏錯過了一些東西,但我只是不知道.. – Idanis