On Wed, Nov 16, 2022 at 02:05:56PM -0500, Chet Ramey wrote: > It doesn't matter. `local -' is the only way to save and restore the > options; `declare -p -' and `typeset -p -' should have no special meaning.
The `declare -p'/`typeset -p' commands and the `local -p' command are different commands. The former gets the variable (or "-") from the first variable scope that can be seen from the function, and the latter only gets variables (or "-") that are declared in the scope of the current function. a () { printf 'LOCAL(a)\n'; local -p -- "$@"; printf 'DECLARE\n'; declare -p -- "$@"; } b () { local x=2; printf 'LOCAL(b)\n'; local -p x; a x ;} c () { local -; printf 'LOCAL(c)\n'; local -p x; a - ;} b # LOCAL(b) # declare -- x="2" # LOCAL(a) # bash: local: x: not found # DECLARE # declare -- x="2" c # LOCAL(c) # local - # LOCAL(a) # bash: local: -: not found # DECLARE # declare -- - The are different commands with different meanings. I don't agree that `declare -p -' should not be meaningful: it tells you whether `local -' is declared in the current scope OR the scope of one of the callers. I don't see why a built-in that is supposed to output valid code, should be allowed to output invalid code only in this specific case, and should require the user to use declare -p - 2> /dev/null && printf 'local -\n'; or something more complex if `declare -p -- "${tosave[@]}"' is used instead of just outputting valid code in all cases. emanuele6