From fbbd476df0fc5e077ba8fbf679e685fdbda4c8df Mon Sep 17 00:00:00 2001 From: Igor Murzov Date: Wed, 9 Nov 2011 05:06:42 +0300 Subject: [PATCH] Add and use _sysvdirs() function that sets correct SysV init directory. This function allows distros to fine tune their init directory location, as simple checking for directories presence is not always sufficient. --- bash_completion | 23 +++++++++++++++++------ completions/service | 16 +++++++++------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/bash_completion b/bash_completion index 9a7eb9f2..72234251 100644 --- a/bash_completion +++ b/bash_completion @@ -102,6 +102,17 @@ _userland() [[ $userland == $1 ]] } +# This function sets correct SysV init directories +# +_sysvdirs() +{ + sysvdirs=( ) + [[ -d /etc/rc.d/init.d ]] && sysvdirs+=( /etc/rc.d/init.d ) + [[ -d /etc/init.d ]] && sysvdirs+=( /etc/init.d ) + # Slackware uses /etc/rc.d + [[ -f /etc/slackware-version ]] && sysvdirs=( /etc/rc.d ) +} + # This function checks whether we have a given program on the system. # _have() @@ -1043,13 +1054,12 @@ _backup_glob='@(#*#|*@(~|.@(bak|orig|rej|swp|dpkg*|rpm@(orig|new|save))))' # _services() { - local sysvdir famdir - [ -d /etc/rc.d/init.d ] && sysvdir=/etc/rc.d/init.d || sysvdir=/etc/init.d - famdir=/etc/xinetd.d + local sysvdirs famdir=/etc/xinetd.d + _sysvdirs local restore_nullglob=$(shopt -p nullglob); shopt -s nullglob - COMPREPLY=( $( printf '%s\n' $sysvdir/!($_backup_glob|functions) ) ) + COMPREPLY=( $( printf '%s\n' ${sysvdirs[0]}/!($_backup_glob|functions) ) ) if [ -d $famdir ]; then COMPREPLY+=( $( printf '%s\n' $famdir/!($_backup_glob) ) ) @@ -1060,7 +1070,8 @@ _services() COMPREPLY+=( $( systemctl list-units --full --all 2>/dev/null | \ awk '$1 ~ /\.service$/ { sub("\\.service$", "", $1); print $1 }' ) ) - COMPREPLY=( $( compgen -W '${COMPREPLY[@]#@($sysvdir|$famdir)/}' -- "$cur" ) ) + COMPREPLY=( $( compgen -W '${COMPREPLY[@]#@(${sysvdirs[0]}|$famdir)/}' \ + -- "$cur" ) ) } # This function completes on modules @@ -1838,7 +1849,7 @@ _completion_loader() [[ $BASH_SOURCE == */* ]] && compdir="${BASH_SOURCE%/*}/completions" # Special case for init.d scripts. - if [[ $1 == /etc?(/rc.d)/init.d/* ]]; then + if [[ $1 == /etc/@(rc.d|init.d)/* ]]; then . "$compdir/service" &>/dev/null && return 124 || return 1 fi diff --git a/completions/service b/completions/service index f008770e..147aad4f 100644 --- a/completions/service +++ b/completions/service @@ -15,20 +15,22 @@ _service() if [[ $cword -eq 1 && $prev == ?(*/)service ]]; then _services else - local sysvdir - [ -d /etc/rc.d/init.d ] && \ - sysvdir=/etc/rc.d/init.d || sysvdir=/etc/init.d + local sysvdirs + _sysvdirs COMPREPLY=( $( compgen -W '`sed -e "y/|/ /" \ -ne "s/^.*\(U\|msg_u\)sage.*{\(.*\)}.*$/\2/p" \ - $sysvdir/${prev##*/} 2>/dev/null` start stop' -- "$cur" ) ) + ${sysvdirs[0]}/${prev##*/} 2>/dev/null` start stop' -- "$cur" ) ) fi return 0 } && complete -F _service service -for svc in /etc/init.d/!($_backup_glob) /etc/rc.d/init.d/!($_backup_glob); do - [ -x "$svc" ] && complete -F _service $svc +_sysvdirs +for svcdir in ${sysvdirs[@]}; do + for svc in $svcdir/!($_backup_glob); do + [ -x "$svc" ] && complete -F _service $svc + done done -unset svc +unset svc svcdir sysvdirs # ex: ts=4 sw=4 et filetype=sh