Bash: 如何在使用微调器时获取命令的退出代码?
Bash: How to get exit code of a command while using a spinner?
在 bash 脚本中,我有一个很长的 运行 命令(比如 rsync
)有时一段时间不显示输出,所以我想做两个事情:
对该命令使用微调器以显示脚本尚未冻结(即我们只是在等待输出);并且,
完成后获取长 运行 命令的退出状态,以便稍后在脚本中进行进一步测试。
但问题是,我不太了解将进程发送到后台的处理方式,以及以这种方式处理退出代码的方式,所以我不确定如何进行这项工作。
感谢 的微调器,这是我目前所拥有的:
#!/bin/bash
spinner() {
local PROC=""
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 "3[1;34m"
while [ -d /proc/$PROC ]; do
printf '3[s3[u[ / ] %s3[u' "$str"; sleep "$delay"
printf '3[s3[u[ — ] %s3[u' "$str"; sleep "$delay"
printf '3[s3[u[ \ ] %s3[u' "$str"; sleep "$delay"
printf '3[s3[u[ | ] %s3[u' "$str"; sleep "$delay"
done
printf '3[s3[u%*s3[u3[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 以什么退出状态退出(通过将该程序的退出状态设置为它自己的退出状态),当给定该 PID 作为参数时。
sleep 2 & sleep_pid=$!
spinner "$sleep_pid"
wait "$sleep_pid"; exitCode=$?
echo "exitcode: $exitCode"
请注意,在后半部分收集 $!
或 $?
时,将多个命令组合到一行是我强烈推荐的做法——它可以防止您尝试收集的值被错误更改(例如有人后来向您的代码添加了新的日志行,却没有意识到它有副作用)。
在 bash 脚本中,我有一个很长的 运行 命令(比如 rsync
)有时一段时间不显示输出,所以我想做两个事情:
对该命令使用微调器以显示脚本尚未冻结(即我们只是在等待输出);并且,
完成后获取长 运行 命令的退出状态,以便稍后在脚本中进行进一步测试。
但问题是,我不太了解将进程发送到后台的处理方式,以及以这种方式处理退出代码的方式,所以我不确定如何进行这项工作。
感谢
#!/bin/bash
spinner() {
local PROC=""
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 "3[1;34m"
while [ -d /proc/$PROC ]; do
printf '3[s3[u[ / ] %s3[u' "$str"; sleep "$delay"
printf '3[s3[u[ — ] %s3[u' "$str"; sleep "$delay"
printf '3[s3[u[ \ ] %s3[u' "$str"; sleep "$delay"
printf '3[s3[u[ | ] %s3[u' "$str"; sleep "$delay"
done
printf '3[s3[u%*s3[u3[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 以什么退出状态退出(通过将该程序的退出状态设置为它自己的退出状态),当给定该 PID 作为参数时。
sleep 2 & sleep_pid=$!
spinner "$sleep_pid"
wait "$sleep_pid"; exitCode=$?
echo "exitcode: $exitCode"
请注意,在后半部分收集 $!
或 $?
时,将多个命令组合到一行是我强烈推荐的做法——它可以防止您尝试收集的值被错误更改(例如有人后来向您的代码添加了新的日志行,却没有意识到它有副作用)。