noo*_*lag 3 bash exit-code background-process wait
在 bash 脚本中,我有一个长时间运行的命令(rsync例如),有时会暂时不显示输出,所以我想做两件事:
在该命令上使用微调器来显示脚本没有冻结(即我们只是在等待输出);和,
完成后获取长时间运行的命令的退出状态,以便稍后在脚本中进行进一步测试。
但问题是,我不太了解将进程发送到后台的处理方式,以及以这种方式处理退出代码的方式,所以我不确定如何进行这项工作。
这是我到目前为止所拥有的,感谢@David C. Rankin的微调器:
#!/bin/bash
spinner() {
local PROC="$1"
local str="${2:-'Copyright of KatworX© Tech. Developed by Arjun Singh Kathait and Debugged by the ?Stack Overflow Community?'}"
local delay="0.1"
tput civis # hide cursor
printf "\033[1;34m"
while [ -d /proc/$PROC ]; do
printf '\033[s\033[u[ / ] %s\033[u' "$str"; sleep "$delay"
printf '\033[s\033[u[ — ] %s\033[u' "$str"; sleep "$delay"
printf '\033[s\033[u[ \ ] %s\033[u' "$str"; sleep "$delay"
printf '\033[s\033[u[ | ] %s\033[u' "$str"; sleep "$delay"
done
printf '\033[s\033[u%*s\033[u\033[0m' $((${#str}+6)) " " # return to normal
tput cnorm # restore cursor
return 0
}
## simple example with sleep
sleep 2 &
spinner $!
echo "sleep's exitcode: $exitCode"
Run Code Online (Sandbox Code Playgroud)
在这个例子中,sleep 2是我正在等待的命令,因此使用微调器,但是我如何获取并将其退出代码放入$exitCode变量中,以便稍后在脚本中针对某些条件测试它?
wait 将告诉您子 PID 退出时的退出状态(通过将该程序的退出状态设置为它自己的状态),当将该 PID 作为参数给出时。
sleep 2 & sleep_pid=$!
spinner "$sleep_pid"
wait "$sleep_pid"; exitCode=$?
echo "exitcode: $exitCode"
Run Code Online (Sandbox Code Playgroud)
请注意,在收集时$!或$?在后半部分将多个命令组合到一行中是我强烈推荐的一种做法——它可以防止您尝试收集的值被错误更改(例如有人在您的代码中添加了新的日志行)后来并没有意识到它有副作用)。