# bash completion for dsv # shellcheck shell=bash _dsv() { local cur=${COMP_WORDS[COMP_CWORD]} cmd=${COMP_WORDS[1]:-} if ((COMP_CWORD == 1)); then mapfile -t COMPREPLY < <(compgen -W "list status enable disable start stop restart logs new rm help" -- "$cur") return fi case $cmd in enable) # services that are not enabled yet local all=() s for s in /etc/sv/*/; do s=${s%/} s=${s##*/} [[ -e /etc/runit/runsvdir/default/$s ]] || all+=("$s") done mapfile -t COMPREPLY < <(compgen -W "${all[*]}" -- "$cur") ;; disable | start | stop | restart) mapfile -t COMPREPLY < <(compgen -W "$(ls /etc/runit/runsvdir/default 2>/dev/null)" -- "$cur") ;; new) case ${COMP_WORDS[COMP_CWORD - 1]} in --user) mapfile -t COMPREPLY < <(compgen -u -- "$cur") ;; --dir) mapfile -t COMPREPLY < <(compgen -d -- "$cur") ;; --cmd) mapfile -t COMPREPLY < <(compgen -c -- "$cur") ;; --env) ;; *) mapfile -t COMPREPLY < <(compgen -W "--cmd --user --dir --env --no-log --enable" -- "$cur") ;; esac ;; status | logs | log | rm) if [[ $cmd == logs* ]] && ((COMP_CWORD == 3)); then mapfile -t COMPREPLY < <(compgen -W "-f" -- "$cur") else mapfile -t COMPREPLY < <(compgen -W "$(ls /etc/sv 2>/dev/null)" -- "$cur") fi ;; esac } complete -F _dsv dsv