¿Cómo restablecer COMP_WORDBREAKS sin afectar a otro script de finalización?

Hay algo que me confunde cuando implemento una función de autocompletado de bash que pondré en /etc/bash_completion.d/

Para lograr alguna función, quiero eliminar los caracteres de salto de palabra colon ( $COMP_WORDBREAKS de la variable $COMP_WORDBREAKS y agregar una barra inclinada ( / ) al comienzo de $COMP_WORDBREAKS .

 COMP_WORDBREAKS=" /'><=;|&(" _mytool() { local cur=${COMP_WORDS[COMP_CWORD]} compopt -o nospace # my implement here COMPREPLY=( $(compgen ..........my_implement......... -- $cur) ) } complete -F _mytool mytool 

Sin embargo, no puedo restablecer COMP_WORDBREAKS directamente porque el valor se comparte con otras secuencias de comandos de finalización. En el momento en que se llama a la función de finalización, la matriz variable COMP_WORDS ya se ha COMP_WORDS , por lo que los cambios locales COMP_WORDBREAKS no tienen ningún efecto.

¿Hay alguna solución para cambiar COMP_WORDBREAKS en un script de finalización y no tiene efecto en otro script?

 $ echo $BASH_VERSION 4.2.10(1)-release 

La modificación de $COMP_WORDBREAKS en su script de finalización no es la manera recomendada (ya que es una variable global y podría afectar el comportamiento de otros scripts de finalización, por ejemplo, ssh).

Sin embargo, la finalización de bash ofrece algunos métodos de ayuda que puede usar para lograr su objective.

La forma recomendada de manejar caracteres que no contienen palabras en palabras de finalización es mediante el uso de los dos métodos de ayuda:

  • _get_comp_words_by_ref con la opción -n EXCLUDE
    • obtiene la palabra completa sin considerar los caracteres en EXCLUDE como saltos de palabra
  • __ltrim_colon_completions

Entonces, aquí hay un ejemplo básico de cómo manejar dos puntos (:) en palabras de finalización:

 _mytool() { 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 

Como consejo final, los métodos de ayuda se encuentran en /etc/bash_completion . Eche un vistazo al interior para leer una descripción detallada de cada método y descubrir más métodos auxiliares.