Tidyup.
authorIain Patterson <me@iain.cx>
Thu, 13 Jun 2013 09:28:25 +0000 (10:28 +0100)
committerIain Patterson <me@iain.cx>
Thu, 13 Jun 2013 09:28:25 +0000 (10:28 +0100)
Don't treat -? as a glob.
Print options in alphabetical order.
Use \b instead of space to match the program name.

opt/bin/find_working

index cec62fa..77bf17e 100755 (executable)
@@ -2,8 +2,8 @@
 #
 # find_working: Find a version of some tool in the PATH which actually runs.
 # Usage: find_working [options] <prog>
-# Options: -a <args>   Use arguments to test executable files.  Default --help.
-#          -A          Don't test arguments to executable files.
+# Options: -A          Don't test arguments to executable files.
+#          -a <args>   Use arguments to test executable files.  Default --help.
 #          -q          Don't print path to prog.  Just exit 0 if found.
 #          -x          Don't try to execute unreadable files.  Assume success.
 #          -X          Don't try to execute unreadable files.  Assume failure.
 args="-h -? --help"
 quiet=0
 unreadable=
-while getopts ":a:AqxX" opt; do
+while getopts ":Aa:qxX" opt; do
   case $opt in
-    a) args="$OPTARG";;
     A) args="";;
+    a) args="$OPTARG";;
     q) quiet=1;;
     x) unreadable=0;;
     X) unreadable=1;;
@@ -26,28 +26,31 @@ shift $((OPTIND-1))
 prog="$1"; shift
 if [ -z "$prog" ]; then
   echo >&2 "Usage: find_working [options] <prog>"
-  echo >&2 "Options: -a <args>   Use arguments to test executable files.  Default --help."
-  echo >&2 "         -A          Don't test arguments to executable files."
+  echo >&2 "Options: -A          Don't test arguments to executable files."
+  echo >&2 "         -a <args>   Use arguments to test executable files.  Default --help."
   echo >&2 "         -q          Don't print path to prog.  Just exit 0 if found."
   echo >&2 "         -x          Don't try to execute unreadable files.  Assume success."
   echo >&2 "         -X          Don't try to execute unreadable files.  Assume failure."
   exit 1
 fi
 
+# Default args contain -? which might be interpreted as a glob.
+set -o noglob
+
 ret=
 for path in ${PATH//:/ }; do
   [ -x "$path/$prog" ] || continue
 
   if [ -r "$path/$prog" ]; then
     if [ -n "$args" ]; then
-      "$path/$prog" $args 2>&1 | grep " $prog " >/dev/null || continue
+      "$path/$prog" $args 2>&1 | grep "\\b$prog\\b" >/dev/null || continue
     else
       ldd "$path/$prog" 2>/dev/null | grep "not found" >/dev/null && continue
     fi
     ret="$path/$prog"
     break
   elif [ -z "$unreadable" ]; then
-    "$path/$prog" $args 2>&1 | grep " $prog " >/dev/null || continue
+    "$path/$prog" $args 2>&1 | grep "\\b$prog\\b" >/dev/null || continue
     ret="$path/$prog"
     break
   elif [ $unreadable = 0 ]; then