从脚本中运行命令时Bash进度条

时间:2016-12-18 11:34:15

标签: linux bash ubuntu io progress-bar

我正在编写一个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}"

1 个答案:

答案 0 :(得分:2)

好吧,因此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