Bash Completion script to complete file path after certain arguments options

autocomplete, bash, shell

Solution

You can use `compgen -f` to complete filenames, like this:

if [[ ${prev} == --*file ]] || [[ ${prev} == --out ]]; then
    COMPREPLY=( $(compgen -f -- ${cur}) )
elif ...

However, `compgen -f` isn't great at completing filenames because it doesn't honour spaces in filenames.

A better way is to use the `_filedir` function available in bash-completion-lib. It might already be available on your system (type: `declare -f _filedir` to check).

Using `_filedir`, your completion function becomes:

if [[ ${prev} == --*file ]] || [[ ${prev} == --out ]]; then
    _filedir
elif ...

Problem

I am writing a bash completion script for a command-line tool: ``` _plink() { local cur prev opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" opts="--1 --23file --a1-allele --a2-allele --adjust --aec" if [[ ${cur} == --*file ]] || [[ ${cur} == --out ]]; then COMPREPLY=( $(compgen -W "$(ls)" -- ${cur}) ) elif [[ ${cur} == -* ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 fi } complete -F _plink plink1.9 ``` The idea is if the after the option `--*file` and `--out`, bash should autocomplete the file path. Right now I am using "`$(ls)`" which only completes the filenames in current working path. Any suggestions?

Original source