Use find_working to prepare aliases.
authorIain Patterson <me@iain.cx>
Fri, 24 Apr 2009 16:49:41 +0000 (17:49 +0100)
committerIain Patterson <me@iain.cx>
Fri, 24 Apr 2009 16:49:41 +0000 (17:49 +0100)
The find_working script will find a usable program somewhere in the PATH.

.profile.d/aliases.bashrc
.profile.d/screen.bashrc
.profile.d/vim.bashrc [new file with mode: 0644]
opt/bin/find_working [new file with mode: 0755]

index 943f879..18a8b76 100644 (file)
@@ -1,7 +1,7 @@
-alias knh='kill_known_host'
-if which vim 2>/dev/null | grep ^/ >/dev/null; then
-  alias vim='vim +syn\ on'
-  alias vi='vim'
-fi
+unalias rm 2>/dev/null
+unalias mv 2>/dev/null
+unalias cp 2>/dev/null
+
 alias debug='valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=5 --verbose --time-stamp=yes --track-fds=yes'
+alias knh='kill_known_host'
 alias svnfind='find . -type f ! -path "*/.svn/*"'
index 90b3707..ca08f6e 100644 (file)
@@ -1,16 +1,18 @@
 # Fixup screen and define ``session'' if available.
-screen=$(which screen 2>/dev/null)
-if [ ! -z "$screen" ]; then
+screen=$(find_working screen 2>/dev/null)
+if [ $? = 0 ]; then
   # Override SCREENDIR iff screen is not setuid.
   if ! ls -l "$screen" | cut -d ' ' -f 1 | grep s >/dev/null; then
     export SCREENDIR="$HOME/.screen/$HOSTNAME"
   fi
 
-  if which krenew 2>/dev/null | grep ^/ >/dev/null; then
-    alias kscreen='krenew --'
+  krenew=$(find_working krenew 2/dev/null)
+  if [ $? = 0 ]; then
+    alias kscreen="$krenew --"
   else
     alias kscreen=''
   fi
+  unset krenew
 
   alias session='bigscreen -rx -S session || kscreen bigscreen -S session'
 fi
diff --git a/.profile.d/vim.bashrc b/.profile.d/vim.bashrc
new file mode 100644 (file)
index 0000000..4ee1bc0
--- /dev/null
@@ -0,0 +1,3 @@
+vim=$(find_working vim 2>/dev/null)
+[ $? = 0 ] && alias vi="$vim"
+unset vim
diff --git a/opt/bin/find_working b/opt/bin/find_working
new file mode 100755 (executable)
index 0000000..cbbd82d
--- /dev/null
@@ -0,0 +1,61 @@
+#!/bin/bash
+#
+# 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.
+#          -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:qxX" opt; do
+  case $opt in
+    a) args="$OPTARG";;
+    q) quiet=1;;
+    x) unreadable=0;;
+    X) unreadable=1;;
+  esac
+done
+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 "         -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
+
+ret=
+for path in ${PATH//:/ }; do
+  [ -x "$path/$prog" ] || continue
+
+  if [ -r "$path/$prog" ]; then
+    ldd "$path/$prog" 2>/dev/null | grep "not found" >/dev/null && continue
+    ret="$path/$prog"
+    break
+  elif [ -z "$unreadable" ]; then
+    "$path/$prog" $args 2>&1 | grep " $prog " >/dev/null || continue
+    ret="$path/$prog"
+    break
+  elif [ $unreadable = 0 ]; then
+    ret="$path/$prog"
+    break
+  elif [ $unreadable = 1 ]; then
+    continue
+  fi
+
+  exit 0
+done
+
+if [ -n "$ret" ]; then
+  [ $quiet = 0 ] && echo "$ret"
+  exit 0
+fi
+
+exit 100