I can't get a simple bash autocompletion function to work. I need to autocomplete file names from a predefined directory so it will look like this:
$ cmd log<TAB><TAB> file1.log file2.log file3.log Where files are from /var/log/app.
I don't see the point of using ls when the shell can list files just fine by itself, so here's one using just the shell.
_cmd() { local files=("/var/log/app/$2"*) [[ -e ${files[0]} ]] && COMPREPLY=( "${files[@]##*/}" ) } complete -F _cmd cmd files as an array is powerful. Arrays are documented at gnu.org/software/bash/manual/bash.html#ArraysPut them into ~/.bashrc
_cmd() { COMPREPLY=($(ls /var/log/app)); } complete -F _cmd cmd To write a full-featured auto-complete function,
please take a look at /etc/bash_completion.d/python.
ls is not necessary and it's not intended to be used that way. _cmd() { COMPREPLY=(/var/log/app/*); }I found this to work as needed:
COMPREPLY=( $(compgen -W "$(ls /var/log/app/)" -- $cur) ) Thanks to dogbane in https://unix.stackexchange.com/questions/28283/autocomplete-of-filename-in-directory !
$cur.