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?