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

问题描述

在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"

在此示例中,sleep 2是我正在等待的命令,因此可以使用微调器,但是如何获取退出代码并将其放入$exitCode变量中,因此我可以进行测试稍后在脚本中用于某些条件?

解决方法

wait将告诉您子PID退出时的退出状态(通过将该程序的退出状态设置为自己的退出状态)。

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

echo "exitcode: $exitCode"

请注意,我强烈建议在下半年收集$!$?时将多个命令组合到一行上,以防止您试图收集的值被更改错误(例如后来有人在代码中添加了新的日志行而没有意识到这会产生副作用)。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...