我正在写一个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
命令运行,如果它正在运行,请按下面的代码所示打印安装条。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