对话 UNIX,第 11 部分: 漫谈 UNIX 文件系统( 四 )


另一种方法(这是我更喜欢的范例)是为每一个本地添加的包创建一个根目录,特别是在这个包很大的情况下 。例如,我将 MySQL V5 安装到 /usr/local/mysql5.0,将 Apache V2.2 安装到 /usr/local/apache2.2 。每个包的安装程序都会在包的根目录中创建它自己的 bin、lib 和 man 目录 。
这种方法有一个缺点,每个最终用户必须向他或她的 PATH 环境变量中添加许多 bin 目录 。并且当这一需求并不是特别复杂时,通过在系统范围的 Shell 启动文件中扩展缺省的 PATH 设置,就可以解决这个问题 。例如,Bash 系统范围启动脚本 /etc/profile,可能包含:
PATH="/bin:/usr/bin:/usr/local/bin"
PATH="$PATH:/usr/local/mysql5.0/bin"
PATH="$PATH:/usr/local/perl6/bin"
PATH="$PATH:/usr/local/Zend/bin"
export PATH
然而,将一个包存储在它自己的“容器中,这是很有好处的:
哪个包提供了特定的应用程序,这是显而易见的 。遵循这一分类系统,您可以使用 which 命令找到包的名字:$ which mysql
/usr/local/mysql5.0/bin/mysql
您可以同时保留同一个包的不同版本 。例如,如果您希望提供 Perl V5.6 和 Perl V5.8,可以将前者安装到 /usr/local/perl5.6,将后者安装到 /usr/local/perl5.8 。每个用户都可以通过改变 PATH 变量,来选择一个 Perl 版本 。
您可以同时保留不同的版本,但是可以通过使用符号链接,使得缺省情况下对应于某一个特定的版本 。只需创建一个到您希望提供的包的版本的符号链接即可 。例如,假定您提供了前面介绍的两个 Perl 版本 。如果您希望将 Perl V5.8 作为缺省值,可以创建一个到 /usr/local/perl5.8 的符号链接,并将它命名为 perl:
$ ls -1 /usr/local/perl*
perl5.6
perl5.8
$ sudo ln -s /usr/local/perl5.8
 /usr/local/perl
$ ls -1 -F /usr/local/perl*
perl5.6/
perl5.8/
perl@
最终用户现在可以添加 /usr/local/perl/bin 到他或她的 PATH 变量以运行 perl 命令 。如果您最后需要或者希望切换到一个更新的或者更旧的 Perl 版本,那么您只需删除该符号链接,并重新创建一个指向不同目录的符号链接即可 。
对于这样的维护任务,符号链接是非常重要的 。您可以维护变量、变更路径,并为方便访问构建集合 。例如,您可以在传统的 /usr/local/bin 目录中填入链接到其他包中的命令的符号链接,如 ln -s /usr/local/perl/bin/perl /usr/local/bin/perl 。(是的,您可以创建指向另一个符号链接的符号链接 。)

推荐阅读