Bash:如何在使用微调器时获取命令的退出代码?
Posted
技术标签:
【中文标题】Bash:如何在使用微调器时获取命令的退出代码?【英文标题】:Bash: How to get exit code of a command while using a spinner? 【发布时间】:2020-08-18 21:34:58 【问题描述】:在 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
变量中,这样我就可以在某些条件下对其进行测试稍后在脚本中?
【问题讨论】:
顺便说一句,作为while [ -d /proc/$PROC ]; do
的更便携替代品,请考虑while kill -0 "$PROC"; do
(它不依赖于与Linux 的procfs 等效的操作系统)。并考虑将变量名称 PROC
更改为 proc
,因为全大写名称在空间中定义为对操作系统有意义的目的;在阅读pubs.opengroup.org/onlinepubs/9699919799/basedefs/… 时,请记住环境变量和常规 shell 变量共享一个命名空间——设置一个 shell 变量会覆盖任何同名的 env var。
【参考方案1】:
wait
将告诉您子 PID 退出时的退出状态(通过将该程序的退出状态设置为自己的退出状态),当给定该 PID 作为参数时。
sleep 2 & sleep_pid=$!
spinner "$sleep_pid"
wait "$sleep_pid"; exitCode=$?
echo "exitcode: $exitCode"
请注意,在后半部分收集$!
或$?
时将多个命令组合到一行是我强烈推荐的一种做法——它可以防止您尝试收集的值被错误地更改(如有人后来在您的代码中添加了新的日志行,却没有意识到它有副作用)。
【讨论】:
以上是关于Bash:如何在使用微调器时获取命令的退出代码?的主要内容,如果未能解决你的问题,请参考以下文章
在 Bash 和 KornShell (ksh) 中获取命令的退出代码