Sanity check path rules with embedded variables.
authorIain Patterson <me@iain.cx>
Thu, 18 Feb 2010 10:44:46 +0000 (10:44 +0000)
committerIain Patterson <me@iain.cx>
Thu, 18 Feb 2010 17:45:29 +0000 (17:45 +0000)
.profile.d/PATH.bashrc

index 0b82245..a67a5ba 100644 (file)
@@ -49,16 +49,35 @@ function copypath() {
   [ -z "$path" ] || eval "export $newpath='$path'"
 }
 
+# Try to expand variables in a path definition, discarding it if expansion fails.
+function expandpath() {
+  local path="$1"; shift
+
+  while [ -n "$path" ]; do
+    [ "${path/\$/}" = "$path" ] && return 0
+    path="${path#*\$}"
+
+    local var="${path%%/*}"
+    eval "[ -n \"\$$var\" ] || return 1"
+  done
+
+  return 0
+}
+
 # Helper.
 function addpath() {
   local path="$1"; shift
   local dir="$1"; shift
 
-  dir=$(eval echo "$dir")
-  if [ -d "$dir" ]; then
-    echo "$path:$dir"
-  else
+  if ! expandpath "$dir"; then
     echo "$path"
+  else
+    dir=$(eval echo "$dir")
+    if [ -d "$dir" ]; then
+      echo "$path:$dir"
+    else
+      echo "$path"
+    fi
   fi
 }
 
@@ -129,4 +148,4 @@ for path in $PATHS; do
 done
 
 
-unset DIR PATHS dir dirs path var source sanitisepath copypath makepath newpath addpath
+unset DIR PATHS dir dirs path var source expandpath sanitisepath copypath makepath newpath addpath