Bash: 如何在使用微调器时获取命令的退出代码?

Bash: How to get exit code of a command while using a spinner?

在 bash 脚本中,我有一个很长的 运行 命令(比如 rsync )有时一段时间不显示输出,所以我想做两个事情:

  1. 对该命令使用微调器以显示脚本尚未冻结(即我们只是在等待输出);并且,

  2. 完成后获取长 运行 命令的退出状态,以便稍后在脚本中进行进一步测试。

但问题是,我不太了解将进程发送到后台的处理方式,以及以这种方式处理退出代码的方式,所以我不确定如何进行这项工作。

感谢 的微调器,这是我目前所拥有的:

#!/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"

请注意,在后半部分收集 $!$? 时,将多个命令组合到一行是我强烈推荐的做法——它可以防止您尝试收集的值被错误更改(例如有人后来向您的代码添加了新的日志行,却没有意识到它有副作用)。