The value of $SHELLOPTS is not always updated correctly after returning from a function that modifies options after using `local -'.
For example: fun() { local -; set -u; }; fun [[ $- == *u* ]]; echo $? # 1 [[ :$SHELLOPTS: == *:nounset:* ]]; echo $? # 0 This seems to be the case for the following set of options: interactive-comments, keyword, monitor, noclobber, noglob, nolog, notify, nounset, onecmd, physical, pipefail, privileged, verbose, xtrace While it works correctly for: allexport, braceexpand, emacs, errexit, errtrace, functrace, hashall, histexpand, history, ignoreeof, noexec, posix, vi