Estoy tratando de configurar un script de finalización de bash y tengo algunos problemas.
Me gustaría configurarlo para que las terminaciones enumeradas sean archivos que coincidan con una extensión particular o directorios (que pueden contener o no archivos de esa extensión).
El problema que tengo es que la única forma en que puedo obtener las terminaciones para contener archivos y directorios es usando algo como -o plusdirs -f -X '!*.txt'
, pero cuando dejo que bash complete uno de los directorios, solo agrega un espacio al final, en lugar de un barra oblicua.
_xyz()
{
local cur=${COMP_WORDS[COMP_CWORD]}
local prev=${COMP_WORDS[COMP_CWORD-1]}
#COMPREPLY=( $( compgen -f -X '!*.txt' -- $cur ) )
#COMPREPLY=( $( compgen -f -G '*.txt' -- $cur ) )
#COMPREPLY=( $( compgen -o filenames -f -X '!*.txt' -- $cur ) )
#COMPREPLY=( $( compgen -o dirnames -f -X '!*.txt' -- $cur ) )
COMPREPLY=( $( compgen -o plusdirs -f -X '!*.txt' -- $cur ) )
return 0
}
complete -F _xyz xyz
También probé todas las líneas comentadas, pero ni siquiera expanden los directorios.
Para las pruebas, he estado ejecutando esto en un directorio con un archivo .txt y un directorio "dir" (con un archivo .txt dentro, aunque eso todavía no importa). Escribir xyz <TAB>
con esta función enumera el directorio y el archivo .txt, pero escribir se xyz d<TAB>
expande a xyz dir
(bueno, con un espacio después de "dir").