问题描述
在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"
在此示例中,sleep 2
是我正在等待的命令,因此可以使用微调器,但是如何获取退出代码并将其放入$exitCode
变量中,因此我可以进行测试稍后在脚本中用于某些条件?
解决方法
wait
将告诉您子PID退出时的退出状态(通过将该程序的退出状态设置为自己的退出状态)。
sleep 2 & sleep_pid=$!
spinner "$sleep_pid"
wait "$sleep_pid"; exitCode=$?
echo "exitcode: $exitCode"
请注意,我强烈建议在下半年收集$!
或$?
时将多个命令组合到一行上,以防止您试图收集的值被更改错误(例如后来有人在代码中添加了新的日志行而没有意识到这会产生副作用)。