2

I have a file which is sourced by an application, adding relevant directories to $PATH and $LD_LIBRARY_PATH.

This is fine, but it results in somewhat excessive pollution of the $PATH and $LD_LIBRARY_PATH, since quite a few paths are added, about 2/3 of which don't exist.

I can test for the existence of the directory using [ ! -d $VARIABLE_TO_ADD_TO_PATH ], but if I find the directory doesn't exist, unsetting it seems to be harder.

I can write (for each of maybe 10 variables)

if [ ! -d $VAR ]
    unset VAR
fi

but I'd rather have a function.

I tried:

_testPathAndUnset()
{
   while [ $# -ge 1 ]
   do
      dirToTest=${1/startPattern/\$startPattern}
      if [ ! -d $dirToTest ]
         unset $1
      fi
      shift
   done
}

passing in values in a form like _testPathAndUnset VAR1 VAR2 VAR3 (not $VAR1 $VAR2 $VAR3), but now I have strings which don't expand.

Using eval might solve this for me, but other questions, answers, websites etc etc suggest this is generally a bad idea.

How can I solve this problem in a better way than 30 lines of 10x3 ?

if [ ! -d $VAR ]
    unset VAR
fi

1 Answer 1

1

Here is a function:

_testPathAndUnset() { for d in "$@"; do [ -d "${!d}" ] || unset "$d"; done; }

Here it is in use. To start with, we have two directories:

$ ls -d */
a1/  a2/

We define four shell variables which may or may not evaluate to directories:

$ one=a1; two=a2; three=a3; four=a4

Now, run our function against those four variables:

$ _testPathAndUnset one two three four

And, observe that only two variables remain set:

$ echo "one=$one two=$two three=$three four=$four"
one=a1 two=a2 three= four=

Details:

  • for d in "$@"

    This loops over every argument on the command line.

  • [ -d "${!d}" ] || unset "$d"

    Here d refers to the name of a variable. ${!d} refers to the value of the variable named d. This tests if the value of the variable named d is a directory. If it is not, the [ test evaluates to false and the unset "$d" clause is executed.

1
  • Perfect - thank you. The explanation is also very helpful.
    – chrisb2244
    Commented Oct 30, 2014 at 3:04

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .