在bash中,$?表示上一个命令或函数的返回值,函数return语句的返回值也可以通过这个变量来获取。但是有些情况下,$?的值可能与函数return语句返回的值不同,这通常是由于在函数中使用了set命令所致。
例如,在以下示例代码中,函数foo返回值为1,但是在使用$?时却返回了2:
function foo() { set +e cmd1 cmd2 set -e return 1 }
foo echo $?
这是因为在set +e和set -e之间执行的命令出现了错误,导致$?的值被设置为2。要解决这个问题,可以在函数中使用其他变量来保存返回值,而不是依赖于$?。例如:
function foo() { local ret=0 set +e cmd1 cmd2 || ret=$? set -e return $ret }
foo echo $?
在这个示例中,ret变量用于保存命令的返回值,而不是直接使用$?。当命令cmd2执行失败时,$ret被设置为命令的返回值,而不会影响$?的值。最后,函数foo返回$ret的值,而不是$?的值。