bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Enable compgen even when programmable completions are not available?


From: alex xmb ratchev
Subject: Re: Enable compgen even when programmable completions are not available?
Date: Mon, 26 Jun 2023 11:55:36 +0200

On Mon, Jun 26, 2023, 11:55 alex xmb ratchev <fxmbsw7@gmail.com> wrote:

>
>
> On Mon, Jun 26, 2023, 11:51 alex xmb ratchev <fxmbsw7@gmail.com> wrote:
>
>>
>>
>> On Mon, Jun 26, 2023, 11:33 Kerin Millar <kfm@plushkava.net> wrote:
>>
>>> On Mon, 26 Jun 2023 17:09:47 +1000
>>> Martin D Kealey <martin@kurahaupo.gen.nz> 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
>>>
>>
>> you forgot
>> see u cmd foo bar=()
>> u still need as always escape ( and )
>>
>> bash-5.2$ bash -c $'f() { shift; printf %s\\n "${1%%=*}"; }; eval "f -a
>> BASH_ARG=\'()\'"'; echo $?
>> BASH_ARGn0
>> bash-5.2$
>>
>
u also really dont need eval at all

by the way , what does this nonsense code supposed to do
> separate between vars for future list / deletement ?
>
> --
>>> Kerin Millar
>>>
>>>


reply via email to

[Prev in Thread] Current Thread [Next in Thread]