Configuration Information [Automatically generated, do not change]: Machine: x86_64 OS: linux-gnu Compiler: gcc Compilation CFLAGS: -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -DDEFAULT_PATH_VALUE='/usr/local/sbin:/usr/local/bin:/usr/bin' -DSTANDARD_UTILS_PATH='/usr/bin' -DSYS_BASHRC='/etc/bash.bashrc' -DSYS_BASH_LOGOUT='/etc/bash.bash_logout' -DNON_INTERACTIVE_LOGIN_SHELLS uname output: Linux t420 5.15.50-1-lts #1 SMP Sat, 25 Jun 2022 14:58:59 +0000 x86_64 GNU/Linux Machine Type: x86_64-pc-linux-gnu
Bash Version: 5.1 Patch Level: 16 Release Status: release Description: `local -p' (and also `declare -p'/`typeset -p') outputs "declare -- -" when used in a function that has declared `local -'. `declare -' (and `typeset -') is not a valid command, not even in functions. The only valid way to localise shell options is `local -' Repeat-By: bash-5.1$ declare - bash: declare: `-': not a valid identifier bash-5.1$ a () { declare -- -; local -p ;} bash-5.1$ a bash: declare: `-': not a valid identifier bash-5.1$ local - bash: local: can only be used in a function bash-5.1$ a () { local -; local -p ;} bash-5.1$ a declare -- - Fix: One solution could be to print `local -' instead of `declare -- -' when shell options are localised, so that the output of local/declare/typeset -p can correctly be evaluated by function to restore variables and `local -'. Another alternative solution is to allow `declare -'/`typeset -' in functions, since they are usually equivalent to `local' anyway (except for some uses like `local -p') and I don't see the point of only allowing `local -'. Also, if bash allows `declare -', it could implement it as a noop if it is ran outside of a funciton and as `local -' if ran inside a function. These way files generated by `declare -p > file' could be safely sourced by both functions and non-functions without triggering the "declare: `-': not a valid identifier" error message.