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

How can `$?` after while loop not be a value that would have terminated the while loop?

我在 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。这怎么可能,即使在原则上也是如此?

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

The exit status of the while loop shall be the exit status of the last compound-list-2 executed, or zero if none was executed.

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