shell退出值的奇怪案例

时间:2016-08-05 04:39:24

标签: bash macos

bash# sh -c "true && [[ $? = 0 ]] && echo XXX"

我希望这会回显XXX,因为true应该将退出值设置为0。

但令我惊讶的是,在我们运行 sh -c 之前,它取决于退出值是什么,即

bash# true

bash# sh -c "true && [[ $? = 0 ]] && echo XXX"

返回XXX

但是,

bash# false

bash# sh -c "true && [[ $? = 0 ]] && echo XXX"

没有按'吨

这意味着我们在sh内部运行的任何命令都不会设置退出值。

这是正确的行为,还是我误解了什么?

2 个答案:

答案 0 :(得分:9)

$?在双引号内扩展,就像任何其他变量一样。因此,在sh看到它之前,它将替换为上一个命令的退出代码。你可能打算使用单引号。

答案 1 :(得分:4)

试试这个:

$ false
$ sh -c 'true && [[ $? -eq 0 ]] && echo XXX'
XXX

或者:

$ false
$ sh -c 'true && [[ "$?" = "0" ]] && echo XXX'
XXX

确保$?未被替换。