Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是";退出${?}”;在bash中使用正确吗?_Bash_Syntax_Exit - Fatal编程技术网

是";退出${?}”;在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退出。
$?
获取否定状态的值。有关问题的解释和一些解决方案,请参阅。