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内部运行的任何命令都不会设置退出值。
这是正确的行为,还是我误解了什么?
答案 0 :(得分:9)
$?
在双引号内扩展,就像任何其他变量一样。因此,在sh
看到它之前,它将替换为上一个命令的退出代码。你可能打算使用单引号。
答案 1 :(得分:4)
试试这个:
$ false
$ sh -c 'true && [[ $? -eq 0 ]] && echo XXX'
XXX
或者:
$ false
$ sh -c 'true && [[ "$?" = "0" ]] && echo XXX'
XXX
确保$?
未被替换。