[arch-projects] [initscripts] simple rc.d bash completion script

Auguste Pop auguste at gmail.com
Wed May 18 12:53:13 EDT 2011


i have made a small patch to initscripts to allow for a simple bash
completion function.

i am not familiar with git, i made the patch by git clone, git branch,
git commit, and git show.

the patch is at http://paste.pocoo.org/show/391299/ and also
copy-pasted as follows:

commit a430fcfb8fcd1e268609473c9a722e1cae1a66f0
Author: Auguste Pop <auguste at gmail.com>
Date:   Thu May 19 00:36:44 2011 +0800

   add a simple bash completion file

diff --git a/Makefile b/Makefile
index 6923840..15df4cf 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
 VER  := $(shell git describe)
-DIRS := /etc/rc.d /etc/conf.d /etc/rc.d/functions.d /etc/cron.hourly /sbin
+DIRS := /etc/rc.d /etc/conf.d /etc/rc.d/functions.d /etc/cron.hourly
/sbin /etc/bash_completion.d

 minilogd: minilogd.o

@@ -13,6 +13,7 @@ install: minilogd installdirs
       install -m755 -t $(DESTDIR)/etc/cron.hourly adjtime
       install -m755 -t $(DESTDIR)/etc/rc.d functions hwclock network netfs
       install -m755 -t $(DESTDIR)/sbin minilogd rc.d
+       install -m644 bash_completion $(DESTDIR)/etc/bash_completion.d/rc.d

 clean:
       rm -f minilogd minilogd.o
diff --git a/bash_completion b/bash_completion
new file mode 100644
index 0000000..a3bd8ed
--- /dev/null
+++ b/bash_completion
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+_rc.d_getdaemons ()
+{
+    /usr/bin/find "$1" -mindepth 1 -maxdepth 1 -type f -printf '%f\n'
+}
+
+_rc.d_arraydiff ()
+{
+    local arr
+    declare -A arr
+
+    for elem in "${!1}"
+    do
+        arr[$elem]=1
+    done
+    for elem in "${!2}"
+    do
+        unset arr[$elem]
+    done
+    echo "${!arr[@]}"
+}
+
+_rc.d ()
+{
+    local command commands available started
+    local cur words cword
+
+    commands="list help start stop restart"
+    available=($(_rc.d_getdaemons /etc/rc.d))
+    started=($(_rc.d_getdaemons /run/daemons))
+
+    _get_comp_words_by_ref -n =: cur words cword
+    [ $cword -gt 1 ] && command=${words[1]}
+
+    if [ -z "$command" ]
+    then
+        COMPREPLY=($(compgen -W "$commands" -- $cur))
+    else
+        case "$command" in
+            start)
+                COMPREPLY=($(compgen -W "$(_rc.d_arraydiff \
+                    available[@] started[@])" -- $cur))
+                ;;
+            stop|restart)
+                COMPREPLY=($(compgen -W "$(echo ${started[@]})" -- $cur))
+                ;;
+            list|help|*)
+                COMPREPLY=()
+                ;;
+        esac
+    fi
+}
+
+complete -F _rc.d rc.d


More information about the arch-projects mailing list