在while循环之后`$?`怎么可能不是一个会终止while循环的值?

时间:2016-12-23 21:44:39

标签: bash while-loop mkdir exit-code built-in

我在bash函数中有这个代码片段:

while ! mkdir lock ; do
    inotifywait -t $WAIT_TIMEOUT -e delete_self lock
done
local es=$?
if (( $es != 0 )); then
    echo "Checkpoint A"
    exit $es
fi

我认为检查点A完全无法访问(因为成功的mkdir肯定是while循环终止时执行的最后一个命令)。

但是,我发现有时会到达检查点A.这怎么可能,即使原则上也是如此?

1 个答案:

答案 0 :(得分:5)

来自http://pubs.opengroup.org/onlinepubs/9699919799/的2.9.4节关于while循环的退出状态:

  

while循环的退出状态应为最后一个的退出状态   执行复合列表-2,如果没有执行则为零。

(这里,“compound-list-2”是while循环的do...done部分内的命令。)因此$?的值将是上次执行inotifywait时返回的结果,如果从未被调用过,则为零。