errexit オプションの動作が POSIX 2013 に合っているか検証する
Rationale によると "The description of the -e option is intended to match the behavior of the 1988 version of the KornShell." らしい。
複合コマンドの失敗が複合コマンド内の単純コマンドの失敗によらないというのはそもそもあまり無いので、どこまで POSIX を厳密に解釈すべきか迷うところ。
例えば以下はシェルによって動きが異なる。(今の) ksh, yash, zsh, dash は終了しないが mksh, bash は終了する。POSIX の条項を文字通り読むなら、POSIX 2008 では終了せず、POSIX 2013 では終了する。
case ${unset_variable?} in *) echo foo;; esac
Errexit の用途を考えると以下の場面では終了する方がいい気がするが、規格や他のシェルの動向を見るためしばらく置いておく。
case ${unset_variable?} in esac for i in ${unset_variable?}; do :; done
これだと bash, dash, yash, ksh は終了せず、zsh, mksh は終了する。さすがにこれは終了した方が良かろう。
while false; do :; done <not_a_file
https://gist.github.com/magicant/aed3b01db211b8bd014e5253b3bc4c80
エッジケースで終了しないのはシェルのなすべき振る舞いとしては気に食わないので、POSIX.1-2013 の字面通りの解釈に合わせた方がいい気がしてきている。
"The description of the -e option is intended to match the behavior of the 1988 version of the KornShell." がどこまでエッジケースを考慮していたのかは不明。
r3636 で NEWS を更新
POSIX.1-2013 で errexit オプションの動作定義が変わっている。少なくとも README の記述を直す必要がある。
http://www.austingroupbugs.net/view.php?id=52 とそこで参照されている他の issues を見よ