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

noo*_*lag 3 bash exit-code background-process wait

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

  1. 在该命令上使用微调器来显示脚本没有冻结(即我们只是在等待输出);和,

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

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

这是我到目前为止所拥有的,感谢@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变量中,以便稍后在脚本中针对某些条件测试它?

Cha*_*ffy 6

wait 将告诉您子 PID 退出时的退出状态(通过将该程序的退出状态设置为它自己的状态),当将该 PID 作为参数给出时。

sleep 2 & sleep_pid=$!
spinner "$sleep_pid"
wait "$sleep_pid"; exitCode=$?

echo "exitcode: $exitCode"
Run Code Online (Sandbox Code Playgroud)

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