Raymond Raymond - 3 years ago 112
Bash Question

How to reset COMP_WORDBREAKS without affecting other completion script?

There is something confuse me when I implement a bash auto-completion function which I'll put it in /etc/bash_completion.d/

In order to achieve some feature, I want to remove the word break characters colon (

) from variable
and add a slash (
) at begin of

COMP_WORDBREAKS=" /'><=;|&("
compopt -o nospace

# my implement here

COMPREPLY=( $(compgen ..........my_implement......... -- $cur) )
complete -F _mytool mytool

However, I can't reset
directly because the value is shared with other completion scripts. By the time the completion function gets called, variable
array has already been populated, so locally changes
have no effect.

Is there any solution for changing
in one completion script and no effect to other script?


Answer Source

Modifying $COMP_WORDBREAKS in your completion script is not the recommended way (as it is a global variable and it could affect the behavior of other completion scripts - for example ssh).

However, bash completion offers some helper methods which you can use to achieve your goal.

The recommended way to handle non-word-breaking characters in completion words is by using the two helper methods:

  • _get_comp_words_by_ref with the -n EXCLUDE option
    • gets the word-to-complete without considering the characters in EXCLUDE as word breaks
  • __ltrim_colon_completions

So, here is a basic example of how to a handle a colon (:) in completion words:

    local cur
    _get_comp_words_by_ref -n : cur

    # my implementation here

    COMPREPLY=( $(compgen ..........my_implement......... -- $cur) )

    __ltrim_colon_completions "$cur"
complete -F _mytool mytool

As a final tip, the helper methods are located in /etc/bash_completion. Take a look inside to read a detailed description of each method and to discover more helper methods.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download