Homebrew安裝Packages是否需要新增環境變數

2020-08-15 01:14:09

通過homebrew安裝的軟體包其實是不需要設定環境變數的,因爲軟體包下載好後,homebrew會自動爲軟體的二進制檔案建立符號鏈接(symbolic link)也叫軟鏈接。
鏈接檔案在Mac中也叫替身。通過homebrew安裝的軟體包安裝在/usr/local/Cellar目錄下,軟體包的二進制檔案會被建立軟鏈接檔案放在/usr/local/bin中,而Mac開機時,會自動讀取該檔案,使用某個命令時會根據鏈接檔案找到命令的實際位置並執行。所以通過homebrew安裝的軟體包並不需要再設定環境變數。

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命令了。
在这里插入图片描述

不需要再新增環境變數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中,就不需要再新增環境變數