diff options
author | Igor Murzov <e-mail@date.by> | 2011-11-09 05:06:42 +0300 |
---|---|---|
committer | Igor Murzov <e-mail@date.by> | 2011-11-09 05:09:37 +0300 |
commit | fbbd476df0fc5e077ba8fbf679e685fdbda4c8df (patch) | |
tree | 1e9479baf9f7a02933924c4ece1680e0dcaf7864 | |
parent | 588facb6b64a76e8da65b3dcb1daf8bbf073cb41 (diff) | |
download | bash-completion-fbbd476df0fc5e077ba8fbf679e685fdbda4c8df.tar.gz |
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.
-rw-r--r-- | bash_completion | 23 | ||||
-rw-r--r-- | 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 |