Bash 从脚本中发出 运行 命令时的进度条
Bash progress bar when running commands from within a script
我正在编写一个 bash
脚本来执行安装。
我不想让用户看到命令及其输出,所以我将使用 2>&1
重定向它们。
我确实希望为完成安装的每个部分打印一个进度条,并根据是否有错误显示 success/failed 消息,例如:
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
个步骤,请在中间位置插入此函数调用。对于错误消息的实际打印,将安装 header 填充到变量 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
我正在编写一个 bash
脚本来执行安装。
我不想让用户看到命令及其输出,所以我将使用 2>&1
重定向它们。
我确实希望为完成安装的每个部分打印一个进度条,并根据是否有错误显示 success/failed 消息,例如:
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
个步骤,请在中间位置插入此函数调用。对于错误消息的实际打印,将安装 header 填充到变量 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