Before this patch, running local - a second time in the same scope would overwrite the previously saved options:
a () { local -; set -C; echo "2: $-"; local -; set -u; echo "3: $-" ;} echo "1: $-" # 1: himBHs a # 2: himBCHs # 3: himuBCHs echo "4: $-" # 4: himBCHs With this patch, calling local - a second time in the same scope becomes a no-op: a () { local -; set -C; echo "2: $-"; local -; set -u; echo "3: $-" ;} echo "1: $-" # 1: himBHs a # 2: himBCHs # 3: himuBCHs echo "4: $-" # 4: himBHs This matches the behavior of local - in other shells that implement it (e.g. busybox ash and dash) --- builtins/declare.def | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/builtins/declare.def b/builtins/declare.def index f7dac728..ccf4e807 100644 --- a/builtins/declare.def +++ b/builtins/declare.def @@ -410,10 +410,13 @@ declare_internal (WORD_LIST *list, int local_var) if (local_var && variable_context && STREQ (name, "-")) { var = make_local_variable ("-", 0); - FREE (value_cell (var)); /* just in case */ - value = get_current_options (); - var_setvalue (var, value); - VSETATTR (var, att_invisible); + /* local -; local -; is a no-op. */ + if (value_cell (var) == NULL) + { + value = get_current_options (); + var_setvalue (var, value); + VSETATTR (var, att_invisible); + } NEXT_VARIABLE (); } -- 2.39.1