check4progs: Change testing from ‘which’ to iterating over $PATH [Closes: issue1284]
authorThilo Six <tech@xk2c.de>
Sun, 17 Nov 2013 14:34:51 +0000 (15:34 +0100)
committerFrank Terbeck <ft@grml.org>
Sun, 17 Nov 2013 14:37:43 +0000 (15:37 +0100)
This removes the availability of ‘which’ and improves performance when
‘which’ is an external program.

This patch also silently adds options to make the function more quiet
than its default behaviour.

etc/grml/script-functions

index 21085b7..4d6bcea 100644 (file)
@@ -48,25 +48,60 @@ setdialog(){
 # }}}
 
 # {{{ check for availability of program(s)
+# usage example:
+#       check4progs [-s,-q,--quiet,--silent] arg [arg .... argn]
+#
+# with option given either of:
+#       -s,-q,--quiet,--silent
+#
+# check for available progs but produce no output
 check4progs() {
+    [ -n "${ZSH_VERSION}" ] && emulate -L sh
     local RTN=0
-    local ARG=''
-    while [ ${#} -gt 0 ]
+    local oldifs="${IFS}"
+    local ARG d found
+    local VERBOSE=1
+
+    case ${1} in
+        -q | -s | --quiet | --silent)
+            VERBOSE=0
+            shift 1
+            ;;
+
+        *)
+            ;;
+    esac
+
+    while [ $# -gt 0 ]
     do
-        ARG="${1}"
+        ARG="$1"
         shift
 
+        found=0
+        IFS=:
+        for d in $PATH
+        do
+            if [ -x "${d}/${ARG}" ]
+            then
+                found=1
+                break
+            fi
+        done
+        IFS="${oldifs}"
+
         # check for availability
-        if ! \which "${ARG}" >/dev/null 2>&1
+        if [ ${found} -eq 0 ]
         then
-            printf "%s: binary not found\n" "${ARG}" >&2
+            if [ ${VERBOSE} -eq 1 ]
+            then
+                printf "%s: binary not found\n" "${ARG}" >&2
+            fi
             RTN=1
         fi
-
     done
 
     # return non zero, if at least one prog is missing!
-    return ${RTN}
+    return $RTN
 }
 # }}}