Bash shell completion für service

Bash shell completion für den service Befehl von FreeBSD

Posted by Holm Spitzer on 7. July 2016
In FreeBSD, Unix, Shell,

Aktuell beschäftige ich mich wieder mehr mit FreeBSD, oder besser gesagt mit nginx, PHP + phalcon und PostgreSQL unter FreeBSD. Da bleibt es nicht aus, dass man etwas konfiguriert und den Dienst neustarten muss. Da stört es dann doch gewaltig, dass der Befehl service zum Starten, Stoppen, usw. keine completion für die Bash hat. Also machte ich mich daran, das zu ändern. Eher zufällig 8-) fand ich dann am Ende der Manpage service(8) ein rudimentäres Script dafür. Das habe ich erweitert, so dass der Wert der Variable extra_commands des zum Dienst gehörenden rc-Scripts geparst wird und die Liste zu den Standardbefehlen hinzugefügt wird. Die Befehle poll und enabled habe ich bewusst weggelassen, zu force(start|stop) und one(start|stop) habe ich mir noch keine Gedanken gemacht. Das Script speicherte ich unter /usr/local/etc/bash_completion.d/service.sh und fügte einige Zeilen zum Sourcen des Inhalts in die .profile des root-Users ein.

/usr/local/etc/bash_completion.d/service.sh


_service () {
    local cur prev dirs
    dirs=“/etc/rc.d /usr/local/etc/rc.d”
    COMPREPLY=()
    cur=${COMP_WORDS[COMP_CWORD]}
    prev=${COMP_WORDS[COMP_CWORD-1]}
    if [ “${prev}” != “service” ]; then
        for d in ${dirs}; do
            if [ -e “${d}/${prev}” ]; then
                local extracmds=$(cat ${d}/${prev}|grep extra_commands|cut -d’“’ -f2)
            fi
        done
        local cmds=“start stop restart status rcvar ${extracmds}”
        COMPREPLY=( $( compgen -W ‘${cmds}’ – $cur ) )
        return 0
    fi
    COMPREPLY=( $( compgen -W ‘$( service -l )’ – $cur ) )
    return 0
}

complete -F _service serviceHier kann man sich das Script downloaden. service.sh

Nun noch alle Scripte in /usr/local/etc/bash_completion.d sourcen.

/root/.profile


for f in /usr/local/etc/bash_completion.d/*; do
    . $f
done

Das kann man händisch auf der aktuellen Konsole machen oder sich aus- und wieder einloggen und schon geht completion für service.