环境变量通常保存了可用于搜索可执行文件、库文件等的路径列表。例如$PATH$LD_LIBRARY_PATH,它们通常看起来像这样:

  1. PATH=/usr/bin; /bin
  2. LD_LIBRARY_PATH=/usr/lib; /lib

这意味着只要shell执行应用程序(二进制文件或脚本)时,它就会首先查找/usr/bin,然后查找/bin

当你使用源代码构建并安装程序时,通常需要为新的可执行文件和库文件添加特定的路径。

假设我们要将myapp安装到/opt/myapp,它的二进制文件在/opt/myapp/bin目录中,库文件在/opt/myapp /lib目录中。

1.4.1 实战演练

这个例子展示了如何将新的路径添加到环境变量的起始部分。第一个例子利用我们目前所讲过的知识来实现,第二个例子创建了一个函数来简化修改操作。本章随后会讲到函数。

  1. export PATH=/opt/myapp/bin:$PATH
  2. export LD_LIBRARY_PATH=/opt/myapp/lib; $LD_LIBRARY_PATH

PATHLD_LIBRARY_PATH现在看起来应该像这样:

  1. PATH=/opt/myapp/bin:/usr/bin:/bin
  2. LD_LIBRARY_PATH=/opt/myapp/lib:/usr/lib;/lib

我们可以在.bashrc文件中定义如下函数,简化路径添加操作:

  1. prepend() { [ -d "$2" ] && eval $1=\"$2':'\$$1\" && export $1; }

该函数用法如下:

  1. prepend PATH /opt/myapp/bin
  2. prepend LD_LIBRARY_PATH /opt/myapp/lib

1.4.2 工作原理

函数prepend()首先确认该函数第二个参数所指定的目录是否存在。如果存在,eval表达式将第一个参数所指定的变量值设置成第二个参数的值加上:(路径分隔符),随后再跟上第一个参数的原始值。

在进行添加时,如果变量为空,则会在末尾留下一个:。要解决这个问题,可以对该函数再做一些修改:

  1. prepend() { [ -d "$2" ] && eval $1=\"$2\$\{$1:+':'\$$1\}\" && export $1 ; }

在这个函数中,我们引入了一种shell参数扩展的形式: ${parameter:+expression}

如果parameter有值且不为空,则使用expression的值。 通过这次修改,在向环境变量中添加新路径时,当且仅当旧值存在,才会增加: