2016-12-18 123 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