代码之家  ›  专栏  ›  技术社区  ›  Idanis

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

  •  1
  • Idanis  · 技术社区  · 7 年前

    我在写一篇 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 回复  |  直到 7 年前
        1
  •  2
  •   Inian    7 年前

    因此,在中没有本机工具 bash 或者我知道的其他外壳,但您可以在下面使用 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