Estoy creando una función para proporcionar la finalización programable para un comando que uso (con mucha ayuda desde http://www.debian-administration.org/articles/317). El uso script es como sigue:Espacio final condicional con finalización programable bash
script.sh command [command options]
donde comando puede ser o bien 'foo' o 'bar' y opciones de comando de 'foo' son 'a_foo = valor' y 'b_foo = valor' y opciones de comando para 'bar' son 'a_bar = value' y 'b_bar = value'.
Aquí está la configuración que estoy usando:
_script() {
local cur command all_commands
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
command="${COMP_WORDS[1]}"
all_commands="foo bar"
case "${command}" in
foo)
COMPREPLY=($(compgen -W "--a_foo --b_foo" -- ${cur})); return 0;;
bar)
COMPREPLY=($(compgen -W "--a_bar --b_bar" -- ${cur})); return 0;;
*) ;;
esac
COMPREPLY=($(compgen -W "${all_commands}" -- ${cur}))
return 0
}
complete -F _script script.sh
Esto funciona sobre todo como me gustaría:
% script.sh f[TAB]
completa a:
% script.sh foo
(con un espacio al final como se desee)
Sin embargo, esto:
% script.sh foo a[TAB]
completa a:
% script.sh foo a_foo
(también con un espacio al final)
Me gustaría reemplazar el espacio final con un '='. Alternativamente, estaría dispuesto a cambiar los valores pasados a compgen por "--a_foo = --b_foo =", en cuyo caso podría eliminar el espacio final.
Desafortunadamente, el comando no está bajo mi control, así que no puedo cambiar las opciones de línea de comando para que tengan el formato "--a_foo value" en lugar de "--a_foo = value".
Perfecto ... gracias. Veo el componente ahora en las páginas de bash man. ¡Probablemente debería mencionarse en la sección de Finalización programable! –
Siempre miro http://bash-completion.alioth.debian.org/ si estoy atascado con terminaciones. Supongo que no existe ninguna característica que no se use en este proyecto ;-) – Cougar
¿Hay alguna forma de hacerlo en bash 3.X? el componente parece existir solo en bash4 y el mac aún no viene con él por defecto. – bjorns