簡體   English   中英

在腳本中運行命令時的Bash進度欄

[英]Bash progress bar when running commands from within a script

我正在編寫一個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}"

好吧,因此我不知道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}"

因此,綜上所述,我有一個簡單的while循環,該循環可運行20個函數,您可以使用類似的方式在腳本的各個位置采用函數調用。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM