Bash Completion Thrown By Quoted Option Args?

Home » CentOS » Bash Completion Thrown By Quoted Option Args?
CentOS 9 Comments

There was a thread about C7 bash completion back in August last year, but it doesn’t have answers for this problem.

Example: “yum install /path/to/local/package” works fine with tab completion to fill in the path and package bits.

However, “yum –debuglevel=”1″ install …” just gets stuck and doesn’t offer anything. The only option is to type everything out, or type enough to use a wildcard. After more testing, I found that any option argument that is quoted breaks completion. Which in turn makes me think this is not even specific to yum but bash completion in general.

Bug? Upstream bug?

9 thoughts on - Bash Completion Thrown By Quoted Option Args?

  • I am going to take a really wild guess and say “Try replacing the outermost quotes with single quotes or escape the double quotes around the numeral 1”. Your second example has double quotes within double quotes and I’m wondering if that’s getting rendered as “yum –debuglevel=” 1 ” install …” (extra space added for emphasis).

  • Leroy Tennison writes:

    The outermost quotes are not part of the command, they were only a means to set off the command typed from the surrounding text.

    Single quotes around the option arg don’t work either.

  • Hello isdtor,

    In that specific example (–debuglevel=”1″), you don’t need the quotes. But, if that’s just an example and you really use command-line arguments that need to be quoted, for instance because they contain spaces, maybe you could just use \ to protect spaces like:
    # command “a b” c would become:
    # command a\ b c (2 params)
    which is different from:
    # command a b c (3 params)
    just escaping the space to prevent bash from considering “a\ b” as two words).

    Also, maybe it’s bash completion for yum that is your problem, did you try disabling yum-specific completion? That would let you still the ability to use path completion.

    Regards,

  • wwp writes:

    In my case, the argument being quoted (different option) is a “*”. Your method of escaping instead of quoting works.

    I couldn’t find anything yum-specific in bash-completion.

    [root@localhost ~]# rpm -ql bash-completion |grep yum
    [root@localhost ~]#

  • isdtor wrote:
    I really haven’t been following this thread, but if it’s about yum, it’s always been perfectly happy with
    $ yum update package\*
    with no quotes at all.

    mark

  • Hello isdtor,

    Glad that it works! Escaping is often an alternate method to quoting, makes things less readable but saves you in some conditions.

    Bash allows modular completion, this is why is may suggest command-line arguments (switches) to `yum` or other commands, see:
    # yum up
    update upgrade It proposes update and upgrades, because bash completion has been told how yum works.

    Unfortunately I don’t have any pointers that would document all this properly, but to say that it’s all in /etc/bash_completion.d and:
    # rpm -qf /etc/bash_completion.d/yum-utils.bash yum-utils-1.1.31-50.el7.noarch and
    # rpm -qa|grep bash-completion bash-completion-extras-2.1-11.el7.noarch bash-completion-2.1-6.el7.noarch

    Here I disabled app-specific completion in my ~/.bash_profile ’cause it might slow down user interaction and sometimes simply cause issues. To get the expanding of paths only (as in bash 2 at least, IIRC):
    # complete -D -o default See `man bash` and look for the `complete` command to know more.

    Regards,

  • The yum bash completion configuration is in the ‘yum’ package.


    Jonathan Billings

  • The ‘yum-utils’ package does have completions for the tools it packages, such as repoquery, but the ‘yum’ package itself has its completion configuration. At least on CentOS 7. Oddly enough, yum-utils puts files in /etc/bash_completion.d rather than in /usr/share/bash-completion/completions/. Overrides?


    Jonathan Billings