轉載自:https://www.jianshu.com/p/529b7558a6e0
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
終端輸出信息如下:
可以看到,/usr/local/bin/mongod這個符號鏈接實際指向了/usr/local/Cellar/mongodb/3.2.7/bin/mongod.
方法2是使用Finder,對mongod符號鏈接文件使用顯示簡介:
image
從圖片中可以很容易看出,mac osx把這種文件類型(種類)歸類為替身,看來符號鏈接又多了一個名字了啊!原身指向/usr/local/Cellar/mongodb/3.2.7/bin/mongod。
對符號鏈接文件進行讀寫的操作會表現為直接對目標文件進行讀寫,刪除符號鏈接不影響目標文件,但是刪除目標文件會導致符號鏈接指向一個不存在的對象。這有點像C語言里的指針,銷毀指針不影響指針所指內存地址,但是如果內存地址被系統回收,會導致指針變成野指針。對於符號鏈接來說,這種情況叫做被遺棄。
Homebrew自動為安裝的bin創建符號鏈接
有了以上關於符號鏈接的了解,接下來說說homebrew是如何為安裝的package對應的bin創建符號鏈接。還是以homebrew安裝mongodb舉例,安裝的原始bin位於/usr/local/Cellar/mongodb/3.2.7/bin,從finder進入該路徑,可以看到mongodb各個命令對應的命令行二進制文件:
image
再打開/usr/local/bin,可以看到以下文件:
image
很明顯,可以看到mongodb各個命令都有對應的以命令的字面符號命名的文件,這些就是符號鏈接。如果打開/usr/local/bin/mongod這個符號鏈接文件,其實是被符號鏈接到了/usr/local/Cellar/mongodb/3.2.7/bin/mongod,接着自然就是執行mongod命令了。
不需要再添加環境變量PATH
網絡上很多教程都說應該再添加環境變量,其實完全是多此一舉。舉個例子,我安裝mongodb3.2.7版本,按照網上很多教程我是需要把這個路徑添加到PATH變量中,即需要在~/.bash_profile中添加下面一行:
export PATH=/usr/local/Cellar/mongodb/3.2.7/bin:${PATH}}
通過Homebrew安裝的package為什么不需要再添加bin的PATH環境變量?
通過上一節我們知道,homebrew會給package的bin里的所有命令創建對應的符號鏈接保存到usr/local/bin目錄下,只要usr/local/bin在PATH中,就不需要再添加環境變量。