# bash autocomplete. # usage: _foo() { _autocomplete "{foo,bar}" } ; complete -F _foo foo # there are also options like -o nospace. see man for more info. _autocomplete() { local commands="${@}" COMPREPLY=() local cur="${COMP_WORDS[COMP_CWORD]}" local prev="${COMP_WORDS[COMP_CWORD-1]}" local command="${COMP_WORDS[0]}" COMPREPLY=( $(compgen -W "${commands}" -- ${cur}) ) return 0 } # autocomplete only first argument. _autocomplete_first() { local commands="${@}" COMPREPLY=() local cur="${COMP_WORDS[COMP_CWORD]}" local prev="${COMP_WORDS[COMP_CWORD-1]}" local command="${COMP_WORDS[0]}" if [[ "${prev}" = "${command}" ]]; then COMPREPLY=( $(compgen -W "${commands}" -- ${cur}) ) return 0 fi } # autocomplete nested program. _autocomplete_nested() { local cur prev words cword split i _init_completion -s || return for ((i = 1; i <= cword; i++)); do if [[ ${words[i]} != -* ]]; then local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin local root_command=${words[i]} _command_offset ${i} return fi done }