[Bash-completion-devel] [bash-completion-Bugs][311858] _get_cword breaks command substitution

bash-completion-bugs at alioth.debian.org bash-completion-bugs at alioth.debian.org
Tue Nov 6 19:00:07 UTC 2012


bash-completion-Bugs item #311858, was changed at 2012-11-06 21:00 by Ville Skyttä
You can respond by visiting: 
https://alioth.debian.org/tracker/?func=detail&atid=413095&aid=311858&group_id=100114

>Status: Closed
Priority: 3
Submitted By: Ville Skyttä  (scop-guest)
Assigned to: Nobody (None)
Summary: _get_cword breaks command substitution 
Distribution: None
Originally reported in: Fedora / Red Hat Bugzilla
Milestone: None
>Status: Fix Committed
Original bug number: 512625


Initial Comment:
_get_cword breaks command substitutions ($(...), `...`) by turning them into literal strings.

For example, when one writes "somecommand $(cat /tmp/f<TAB>" the intention is to complete /tmp/f* files, but if the "somecommand" completion does `_get_cword`, that stuff turns to a literal '$(cat /tmp/f' string which is then processed later in the "somecommand" completion function.

----------------------------------------------------------------------

>Comment By: Ville Skyttä  (scop-guest)
Date: 2012-11-06 21:00

Message:
Reportedly fixed by one of these Fedora updates by the OP (https://bugzilla.redhat.com/show_bug.cgi?id=512625, originally reported against bash-completion 1.0):

bash-4.1.7-4.fc15.x86_64
bash-completion-1.2-2.fc14.noarch


----------------------------------------------------------------------

Comment By: Igor Murzov (garik-guest)
Date: 2012-11-04 12:34

Message:
Is this still an issue? Seems to work fine for me.

----------------------------------------------------------------------

Comment By: Freddy Vulto (fvu-guest)
Date: 2009-09-21 00:41

Message:
This is also the default what is in COMP_CWORDS[COMP_CWORD]:

    $ a $(b c
    COMP_CWORD: 1
    COMP_WORDS:
    0: a
    1: $(b c

Since _get_cword's only intention is/was to take the current
cursor position into account, I'm inclined to leave things the
way they are.  Returning `c' would mean re-parsing `$(b c'
which may not be as easy as it seems, regarding handling all
situations with possible quotes and nested meta-characters,
e.g.  $(w3m 'foo bar'<TAB>

What strikes me though, is that bash is starting completion
for `a' whereas bash would do a better job starting completion
for `b', especially since bash already knows that a subshell
is invoked, because it does command completion on `b' in this
case:

    $ a $(b<TAB>
    bash
    bashbug
    batch
    bc

To reproduce:

1.  Install completions for a & b:

    _a() { echo a; }
    _b() { echo b; }
    complete -F _a a
    complete -F _b b

2.  Complete a:

    $ a $(b c<TAB>

Bash replies with 'a' instead of 'b'.

Do you agree that bash should start completion for b?  I'm
inclined to report this as a bug/feature request on bug-bash?

----------------------------------------------------------------------

You can respond by visiting: 
https://alioth.debian.org/tracker/?func=detail&atid=413095&aid=311858&group_id=100114



More information about the Bash-completion-devel mailing list