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