是";退出${?}”;在bash中使用正确吗?
假设我编写了如下代码:是";退出${?}”;在bash中使用正确吗?,bash,syntax,exit,Bash,Syntax,Exit,假设我编写了如下代码: if [ ${?} -ne 0 ]; then exit ${?} 这能正常工作吗? “语法方面”是否正确?检查后,if语句中的[命令将设置$?。测试前需要保存原始退出状态 some_command es=$? if [ "$es" -ne 0 ]; then exit "$es" fi 语法是正确的,但是$?由if语句中的[…]命令重置。根据定义,如果输入if块,则[…]测试必须成功,并且$?保证为0 您需要将其保存在变量中 result=$? i
if [ ${?} -ne 0 ]; then
exit ${?}
这能正常工作吗?
“语法方面”是否正确?检查后,
if
语句中的[
命令将设置$?
。测试前需要保存原始退出状态
some_command
es=$?
if [ "$es" -ne 0 ]; then
exit "$es"
fi
语法是正确的,但是
$?
由if
语句中的[…]
命令重置。根据定义,如果输入if
块,则[…]
测试必须成功,并且$?
保证为0
您需要将其保存在变量中
result=$?
if ((result != 0)); then
exit "$result"
fi
或者,直接测试命令的结果比测试$?
更为惯用。如果这样做,就不会有更改$?
的问题
if command; then
echo success
else
exit # `exit` is equivalent to `exit $?`
fi
如果你不在乎成功,那么你可以使用|
:
command || exit
如果要在出错时退出并保留命令的退出代码,可以启用
errexit
选项:
- 使用:
set-e
- 使用:
set-o errexit
help set | grep-F--e
-e如果命令以非零状态退出,则立即退出
errexit与-e
或者,您可以trap
捕获ERR
信号,并使用该信号退出,返回错误代码
这将避免您处理-e
选项的后果
!/usr/bin/env bash
err_handler(){
设置--$?
printf'错误处理程序捕获的代码#%d\n'$1'>&2
退出“$1”
}
陷阱“err\u handler”错误
创建错误(){
[$#-ne 1]&返回0
printf“创建错误”#%d\n“$1”
返回“$1”
}
创建_错误“$@”
使用不同错误进行测试:
用于102;do./a.sh“$e”echo$?;完成
创建错误#1
错误处理程序捕获了代码#1
1.
创建错误#0
0
创建错误#2
错误处理程序捕获了代码#2
2.
请参阅。使用set-o errexit
(set-e
)。我很乐意与他们打交道,但很多人不是。请参阅,以获得良好、平衡的信息。@pjh我添加了一个带有trap
的替代解决方案。您需要启用errtrace
,以便对所有将使用errexit
触发的对象启用ERR
陷阱触发器。请参阅。ERR
陷阱具有以下优点:处理程序可以打印有关错误上下文的有用信息。(使用errexit
程序有时会无明显原因而神秘停止。)除此之外,ERR
陷阱具有与errexit
相同的限制和困难。需要格外小心。谢谢!这以及@chepner-answer完全消除了我的疑虑。if!命令;然后退出“$?”;fi
(或者if!命令;然后退出;fi
)如果命令
返回(任何)非零状态,将以状态0退出。$?
获取否定状态的值。有关问题的解释和一些解决方案,请参阅。