我正在尝试创建一个安装后的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
解决方法:
#!/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).由于您想要重定向stdout和stderr,因此这些点将打印到/ dev / tty.
标签:bash,linux
来源: https://codeday.me/bug/20190725/1529732.html