Function to prepend to environment variables
Environment variables are often used to store a list of paths of where to search for executables, libraries, and so on. Examples are $PATH
and $LD_LIBRARY_PATH
, which will typically resemble this:
PATH=/usr/bin;/bin LD_LIBRARY_PATH=/usr/lib;/lib
This means that whenever the shell has to execute an application (binary or script), it will first look in /usr/bin
and then search /bin
.
When building and installing a program from source, we often need to add custom paths for the new executable and libraries. For example, we might install myapp
in /opt/myapp
, with binaries in a /opt/myapp/bin
folder and libraries in /opt/myapp/lib
.
How to do it...
This example shows how to add new paths to the beginning of an environment variable. The first example shows how to do this with what's been covered so far, the second demonstrates creating a function to simplify modifying the variable. Functions are covered later in this chapter.
export PATH=/opt/myapp/bin:$PATH export LD_LIBRARY_PATH=/opt/myapp/lib;$LD_LIBRARY_PATH
The PATH
and LD_LIBRARY_PATH
variables should now look something like this:
PATH=/opt/myapp/bin:/usr/bin:/bin LD_LIBRARY_PATH=/opt/myapp/lib:/usr/lib;/lib
We can make adding a new path easier by defining a prepend function in the .bashrc
file.
prepend() { [ -d "$2" ] && eval $1=\"$2':'\$$1\" && export $1; }
This can be used in the following way:
prepend PATH /opt/myapp/bin prepend LD_LIBRARY_PATH /opt/myapp/lib
How it works...
The prepend()
function first confirms that the directory specified by the second parameter to the function exists. If it does, the eval
expression sets the variable, with the name in the first parameter equal to the second parameter string, followed by :
(the path separator), and then the original value for the variable.
If the variable is empty when we try to prepend, there will be a trailing :
at the end. To fix this, modify the function to this:
prepend() { [ -d "$2" ] && eval $1=\"$2\$\{$1:+':'\$$1\}\" && export $1 ; }
Note
In this form of the function, we introduce a shell parameter expansion of the form:${parameter:+expression}
This expands to expression if parameter is set and is not null.With this change, we take care to try to append :
and the old value if, and only if, the old value existed when trying to prepend.