]> ruderich.org/simon Gitweb - config/dotfiles.git/blobdiff - lib.sh
lib.sh: Add installed_path(), a portable `which`.
[config/dotfiles.git] / lib.sh
diff --git a/lib.sh b/lib.sh
index 1fa3c8fc0fedaea09f27b91769f1f93218a793fb..70aefbe48592edd5249b3a0182e135f67e3c2721 100644 (file)
--- a/lib.sh
+++ b/lib.sh
@@ -2,16 +2,52 @@
 #
 # Their setup.sh script sources this file.
 
+# Copyright (C) 2009-2013  Simon Ruderich
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
 
 # csh gives the error "Unknown colorls variable `su'." when used with newer
 # options supported by Zsh or GNU ls.
 unset LS_COLORS
 
 
-# Check if the given program is installed. Returns 0 if it exists, 1
-# otherwise; so it can be used in if.
+# Check if the given program is installed. `type` is portable, `which` is not.
 installed() {
-    which $1 2>&1 | perl -e '$_ = <>; if (not m{^/}) { exit 1 }'
+    type "$1" >/dev/null 2>&1
+}
+# Get the path of the given program. Thanks to Gilles on [1] (read on
+# 2013-03-10) for the PATH-walking idea. `which` is not portable and `type`
+# has no well-formed output format.
+#
+# [1]: http://unix.stackexchange.com/questions/4988/how-do-i-test-to-see-if-an-application-exists-in-path/4991
+installed_path() {
+    test -z "$1" && return 1
+
+    # Keep IFS change local.
+    (
+        IFS=:
+        # Walk PATH.
+        for directory in $PATH; do
+            if test -x "$directory/$1"; then
+                echo "$directory/$1"
+                return 0
+            fi
+        done
+
+        return 1
+    )
 }
 
 # Print the current OS. The following OS are supported at the moment:
@@ -19,6 +55,7 @@ installed() {
 # - Gentoo (gentoo)
 # - Mac OS X (darwin)
 # - Solaris/OpenSolaris (sun)
+# - FreeBSD (freebsd)
 # If an unsupported OS is used an error is printed.
 os() {
     if [ -f /etc/debian_version ]; then
@@ -29,6 +66,8 @@ os() {
         echo darwin
     elif [ x`uname` = xSunOS ]; then
         echo sun
+    elif [ x`uname` = xFreeBSD ]; then
+        echo freebsd
     else
         echo unsupported OS! >&2
         return 1