On Mon, 26 Jun 2023 17:09:47 +1000
Martin D Kealey <[email protected]> wrote:
> Hi Eli
>
> How about using the shell itself to parse the output of "typeset" (an alias
> for "declare"), but redefining "declare" to do something different. This is
> a bit verbose but it works cleanly:
>
> ```
> (
> function declare {
> while [[ $1 = -* ]] ; do shift ; done
> printf %s\\n "${@%%=*}"
> }
> eval "$( typeset -p )"
> )
> ```
Unfortunately, this is defective.
$ bash -c 'declare() { shift; printf %s\\n "${1%%=*}"; }; eval "declare -a
BASH_ARGC=()"'; echo $?
1
In fact, bash cannot successfully execute the output of declare -p in full.
$ declare -p | grep BASH_ARGC
declare -a BASH_ARGC=([0]="0")
$ declare -a BASH_ARGC=([0]="0"); echo $? # echo is never reached
While it is understandable that an attempt to assign to certain shell variables
would be treated as an error, the combination of not printing a diganostic
message and inducing a non-interactive shell to exit is rather confusing.
Further, declare is granted special treatment, even after having been defined
as a function (which might be a bug).
$ bash -c 'declare() { shift; printf %s\\n "${1%%=*}"; }; eval "declare -a
BASH_ARGC=()"'; echo $?
1
$ bash -c 'declare() { shift; printf %s\\n "${1%%=*}"; }; eval "declare -a
BASH_ARG=()"'; echo $?
BASH_ARG
0
$ bash -c 'f() { shift; printf %s\\n "${1%%=*}"; }; eval "f -a BASH_ARGC=()"';
echo $?
bash: eval: line 1: syntax error near unexpected token `('
bash: eval: line 1: `f -a BASH_ARGC=()'
2
$ bash -c 'f() { shift; printf %s\\n "${1%%=*}"; }; eval "f -a BASH_ARG=()"';
echo $?
bash: eval: line 1: syntax error near unexpected token `('
bash: eval: line 1: `f -a BASH_ARG=()'
2
--
Kerin Millar