循环点直到一个过程完成?巴什

时间:2014-09-18 03:57:02

标签: linux bash

我正在尝试创建一个安装后的bash脚本,当我全新安装Ubuntu时我可以使用它。我想要的第一个功能是脚本提示用户是否要更新他们的系统,如果他们选择是,则显示单词" loading"然后是一个点循环,直到进程完成并将输出导出到日志文件。我已设法实现所有这些功能,除了带点的循环。

#!/bin/bash

read -p "Update your system? [y/n]" RESP
if [ "$RESP" = "y" ] || [ "$RESP" = "Y" ] || [ "$RESP" = "Yes" ] || [ $RESP = "yes" ]; then
    echo "Loading..." #dot loop to show that process is occurring    
    sudo apt-get update>>log.txt 2>&1 #when complete want the dots to stop looping.
    echo $?>>log.txt 2>&1  
    echo "UPDATE COMPLETE">>log.txt 2>&1
    echo "----------------------------------------------------------------------------------------------------------------------------------------------------">>log.txt 2>&1
    echo "----------------------------------------------------------------------------------------------------------------------------------------------------">>log.txt 2>&1
    echo "Status=$?"    
    echo "Done"
    sleep 2
    clear
else
    echo "OK"
fi

1 个答案:

答案 0 :(得分:9)

#!/bin/bash

"$@" &

while kill -0 $!; do
    printf '.' > /dev/tty
    sleep 2
done

printf '\n' > /dev/tty

将其另存为名为run_with_dots的脚本。然后你可以这样做:

sudo ./run_with_dots apt-get update >>log.txt 2>&1

您可以传递任何命令,它将运行它并每两秒打印一次点,直到命令完成。 "$@" &将脚本的参数视为要运行的命令,&在后​​台执行。它使用kill -0来检查进程是否仍在运行($!是后台进程的PID)。点打印到/dev/tty,因为您想要重定向stdout和stderr。