# bash completion for getent -*- shell-script -*- proc _getent { local cur prev words cword split _init_completion -s || return local i db for (( i=1; i < cword; i++ )); do case ${words[i]} in -V|--version|--usage|-'?'|--help) return ;; -s|--service) (( i++ )) ;; -*) ;; *) # First non-option value is the db db=${words[i]} break ;; esac done match $db { with passwd setglobal COMPREPLY = ''( $( compgen -u -- "$cur" ) ) return 0 with group setglobal COMPREPLY = ''( $( compgen -g -- "$cur" ) ) return 0 with services setglobal COMPREPLY = ''( $( compgen -s -- "$cur" ) ) return 0 with hosts setglobal COMPREPLY = ''( $( compgen -A hostname -- "$cur" ) ) return 0 with protocols|networks|ahosts|ahostsv4|ahostsv6|rpc setglobal COMPREPLY = ''( $( compgen -W "$( $1 $db | \ awk '{ print $1 }' )" -- "$cur" ) ) return 0 with aliases|shadow|gshadow setglobal COMPREPLY = ''( $( compgen -W "$( $1 $db | cut -d: -f1 )" \ -- "$cur" ) ) return 0 with ethers|netgroup return } match $prev { with -s|--service return } $split && return if [[ $cur == -* ]] { setglobal COMPREPLY = ''( $( compgen -W '$( _parse_help "$1" )' -- "$cur" ) ) [[ $COMPREPLY == *= ]] && compopt -o nospace } elif [[ -z $db ]] { setglobal COMPREPLY = ''( $( compgen -W 'passwd group hosts services protocols networks ahosts ahostsv4 ahostsv6 aliases ethers netgroup rpc shadow gshadow' -- "$cur" ) ) } } && complete -F _getent getent # ex: ts=4 sw=4 et filetype=sh