Hello Greg,

On Mon, May 14, 2018 at 3:19 PM, Greg Wooledge <wool...@eeg.ccf.org> wrote:
>>     local included=$( command sed -ne
>> 's/^[[:blank:]]*[Ii][Nn][Cc][Ll][Uu][Dd][Ee][[:blank:]]\{1,\}\([^#%]*\)\(#.*\)\{0,1\}$/\1/p'
>> "${configfile}" )
>
> So, "included" is a string variable containing the ouput of sed.
>
> If I'm reading that regex correctly, there'll be one pathname per line.
>
>>     for i in ${included[@]}; do
>
> But then the function attempts to treat the string variable as an array,
> and then attempts to iterate over the "array" using an unquoted expansion.
>
> Code like this is one reason why I do not use bash-completion.  Any time
> it doesn't fail is just a lucky coincidence.
>
> In this particular instance, it "works" so long as each pathname in
> sed's output contains NO whitespace and NO globbing characters.  The
> array syntax is a total red herring, though -- you get the same result
> (success or failure) just by expanding the string variable with regular
> string expansion syntax.
>
> wooledg:~$ included=$'/foo/bar\n/Program Files/junk'
> wooledg:~$ args ${included[@]}
> 3 args: </foo/bar> </Program> <Files/junk>
> wooledg:~$ args $included
> 3 args: </foo/bar> </Program> <Files/junk>
>
> A correct implementation would have "included" be a real array variable,
> initialized by splitting the sed output on newlines, so that each
> pathname becomes one array element.  Then, a *correct* array expansion
> (with double quotes) would work:
>
> wooledg:~$ included=(/foo/bar "/Program Files/junk")
> wooledg:~$ args "${included[@]}"
> 2 args: </foo/bar> </Program Files/junk>
>
> I don't know whether bash-completion is targeting bash 4.x exclusively,
> or older bash versions.  If it's targeting bash 4.x then it could use
> mapfile to initialize the array from sed's output.  Otherwise, it needs
> a loop.
>
Maybe you can improve the script talking / sendind pull request? with
¿upstream? ¿https://github.com/scop/bash-completion?

Thank you !

== OFF TOPIC ==
An annoying bug on debian (at least for me):
$ ls $(<TAB>bash: unexpected EOF while looking for matching `)'
bash: syntax error: unexpected end of file

Reply via email to