Homebrew是mac os平台最受欢迎的包管理工具,它会自动管理下载依赖,可以给使用者节省大量时间。可是你了解它是如何管理package的环境变量PATH的吗?你是否一直在重复的配置PATH?读完本文,你将找到答案。

Homebrew二进制文件安装路径
Homebrew的命令二进制文件brew安装路径是usr/local/bin

根据官方常见问题说明文档,通过homebrew安装的包文件(package)一般都位于/usr/local/Cellar文件夹下。比如我安装的mongodb路径为/usr/local/Cellar/mongodb/3.2.7,对应的bin路径为/usr/local/Cellar/mongodb/3.2.7/bin。

符号链接(symbolic link)
在计算机中,符号链接也叫做symlink或者软链接,是一种特殊的文件,相当于是给一个文件或文件夹的路径起了一个外号(昵称,别名),实现符号链接的命令是:

$ ln -s target_path link_path

target_path是我们要起外号的对象(路径,path),link_path就是外号(一般也是一个path)了。

有2种方法可以看到符号链接所指向的真正路径,比如要查看/usr/local/bin/mongod这个符号链接:

方法1是使用命令:

ls -l /usr/local/bin/mongod

终端输出信息如下:

lrwxr-xr-x 1 chenxin admin 34 6 13 10:13 /usr/local/bin/mongod -> …/Cellar/mongodb/3.2.7/bin/mongod
1
可以看到,/usr/local/bin/mongod这个符号链接实际指向了/usr/local/Cellar/mongodb/3.2.7/bin/mongod.

方法2是使用Finder,对mongod符号链接文件使用显示简介:
在这里插入图片描述
从图片中可以很容易看出,mac osx把这种文件类型(种类)归类为替身,看来符号链接又多了一个名字了啊!原身指向/usr/local/Cellar/mongodb/3.2.7/bin/mongod。

对符号链接文件进行读写的操作会表现为直接对目标文件进行读写,删除符号链接不影响目标文件,但是删除目标文件会导致符号链接指向一个不存在的对象。这有点像C语言里的指针,销毁指针不影响指针所指内存地址,但是如果内存地址被系统回收,会导致指针变成野指针。对于符号链接来说,这种情况叫做被遗弃。

Homebrew自动为安装的bin创建符号链接

有了以上关于符号链接的了解,接下来说说homebrew是如何为安装的package对应的bin创建符号链接。还是以homebrew安装mvn举例,安装的原始bin位于/usr/local/Cellar/maven/3.6.3_1/bin/mvn,从finder进入该路径,可以看到mvn各个命令对应的命令行二进制文件:

在这里插入图片描述

再打开/usr/local/bin,可以看到以下文件:

在这里插入图片描述

很明显,可以看到mongodb各个命令都有对应的以命令的字面符号命名的文件,这些就是符号链接。如果打开/usr/local/bin/mvn这个符号链接文件,其实是被符号链接到了/usr/local/Cellar/maven/3.6.3_1/bin/mvn,接着自然就是执行mvn命令了。

homebrew 安装旧版本python homebrew安装路径_mongodb

不需要再添加环境变量PATH
网络上很多教程都说应该再添加环境变量,其实完全是多此一举。举个例子,我安装mongodb3.2.7版本,按照网上很多教程我是需要把这个路径添加到PATH变量中,即需要在~/.bash_profile中添加下面一行:

export PATH=/usr/local/Cellar/maven/3.6.3_1/bin:${PATH}}
1
通过Homebrew安装的package为什么不需要再添加bin的PATH环境变量?

通过上一节我们知道,homebrew会给package的bin里的所有命令创建对应的符号链接保存到usr/local/bin目录下,只要usr/local/bin在PATH中,就不需要再添加环境变量