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 脚本中返回的命令不同的退出代码

在 Bash 和 KornShell (ksh) 中获取命令的退出代码

从 gnome-terminal 中获取 bash 退出命令

自定义可搜索微调器在单击微调器时引发空指针异常

如何获取管道中第一个命令的退出状态? [复制]

如何在变量中获取 bash 命令的输出