捕获退出命令的退出代码

捕获退出命令的退出代码

我在 bash 脚本中有这个:

exit 3;

exit_code="$?"

if [[ "$exit_code" != "0" ]]; then
    echo -e "${r2g_magenta}Your r2g process is exiting with code $exit_code.${r2g_no_color}";
    exit "$exit_code";
fi

看起来它会在退出命令后立即退出,这是有道理的。我想知道是否有一些简单的命令可以提供退出代码而不立即退出?

我本来想猜测:

exec exit 3

但它给出了错误消息:exec: exit: not found。我能做些什么? :)

答案1

如果您有一个运行某个程序并查看该程序的退出状态(带有 $?)的脚本,并且您想通过执行以下操作来测试该脚本某物 这会导致$?被设置为某个已知值(例如,  3),只需执行

(exit 3)

括号创建一个子 shell。然后该exit命令导致该子 shell 以指定的退出状态退出。

答案2

exit是 bash 内置的,所以你不能exec这样做。每bash 的手册:

Bash 的退出状态是脚本中执行的最后一个命令的退出状态。如果没有执行任何命令,则退出状态为 0。

将所有这些放在一起,我想说您唯一的选择是将所需的退出状态存储在变量中,然后exit $MY_EXIT_STATUS在适当的时候存储。

答案3

您可以编写一个函数,返回作为参数给出的状态,或者255如果没有给出的话。 (我称其ret为“返回”其值。)

ret() { return "${1:-255}"; }

并使用ret来代替您对 的调用exit。这避免了在当前接受的答案中创建子 shell 的低效率。

一些测量。

time bash -c 'for i in {1..10000} ; do (exit 3) ; done ; echo $?'

在我的机器上大约需要 3.5 秒。

 time bash -c 'ret(){ return $1 ; } ; for i in {1..10000} ; do ret 3 ; done ; echo $?'

在我的机器上大约需要 0.051 秒,快了 70 倍。采用默认处理仍然使其速度提高了 60 倍。显然,循环有一些开销。如果我将循环体更改为:true然后时间减半为 0.025,则完全空的循环是无效语法。添加;:到循环中可以看出,这个最少的命令需要 0.007 秒,因此循环开销约为 0.018。从两次测试中减去此开销表明该ret解决方案的速度快了 100 倍以上。

显然,这是一个综合测量,但事情会加起来。如果你让一切都比需要的速度慢 100 倍,那么你最终会得到缓慢的系统。 0.0

答案4

您可以使用 awk 执行此操作:

awk 'BEGIN{exit 9}'

或者 Sed:

sed Q9 /proc/stat

相关内容