使用 macOS 安裝環(huán)境,見到過(guò)很數(shù)種環(huán)境變量配置方法,每次也都是按照別人的代碼,人家配置在哪 我就配置在哪,其實(shí)不太清楚有什么區(qū)別,決定記錄下。
- 本機(jī) macOS 13.3,從 macOS Catalina(10.15) 開始,macOS的默認(rèn)終端從bash變成了zsh ,所以在網(wǎng)上經(jīng)??吹降?
~/.bash_profile
事實(shí)上是無(wú)法生效的,應(yīng)該修改~/.zshrc
。 - 我們常說(shuō)的環(huán)境變量修改有兩種方式,分為系統(tǒng)級(jí)別(對(duì)所有用戶生效)和用戶級(jí)別(對(duì)當(dāng)前用戶生效),像
/etc/profile
這種在 /etc 目錄下的配置則都屬于全局配置,~/
則屬于用戶級(jí)別的,當(dāng)然 macOS 也不是服務(wù)器,一般就自己一個(gè)人用,也不用分得太清楚。
系統(tǒng)級(jí)別
-
/etc/profile
文件- 語(yǔ)法格式:采用 Shell 命令語(yǔ)法
- 加載時(shí)間:系統(tǒng)啟動(dòng)時(shí)加載,更新重啟生效。
- 不建議修改,最好在用戶級(jí)別的配置文件中進(jìn)行個(gè)性化設(shè)置。
-
/etc/paths
文件:路徑格式,在系統(tǒng)啟動(dòng)時(shí),這些路徑會(huì)被添加到全局的$PATH環(huán)境變量的前面,影響所有用戶和進(jìn)程。- 語(yǔ)法格式:每行一個(gè)路徑,沒(méi)有特定的語(yǔ)法格式。
- 加載時(shí)間:系統(tǒng)啟動(dòng)時(shí)加載,更新重啟生效【但本機(jī)實(shí)測(cè)更新后,打開新終端窗口能夠生效,不確定】。
- 加載原理:系統(tǒng)啟動(dòng)時(shí),其中的路徑會(huì)被添加到系統(tǒng)的 $PATH 環(huán)境變量的前面
- 全局環(huán)境變量建議修改這個(gè)文件。
- macOS 特供(
/etc/paths.d/
同),在 Linux 系統(tǒng)中通常不是標(biāo)準(zhǔn)配置,Linux 通常使用/etc/profile
或/etc/environment
-
/etc/paths.d/
目錄:這個(gè)目錄中可以放置其他路徑設(shè)置的文件,每個(gè)文件包含一行一個(gè)路徑。同樣在系統(tǒng)啟動(dòng)時(shí),這些路徑會(huì)被添加到全局的$PATH環(huán)境變量的前面,影響所有用戶和進(jìn)程。- 語(yǔ)法格式:每個(gè)文件包含一組路徑,沒(méi)有特定的語(yǔ)法格式。
- 加載時(shí)間:系統(tǒng)啟動(dòng)時(shí)加載。
- 加載原理:
/etc/profile
腳本中有一行eval `/usr/libexec/path_helper -s
,這個(gè)path_helper
工具會(huì)讀取/etc/paths.d
目錄下的文件里面的路徑,然后加載在環(huán)境變量$PTAH
。
/etc/paths
vs /etc/paths.d
:
-
macOS 系統(tǒng)升級(jí)時(shí),
/etc/paths
文件在系統(tǒng)升級(jí)時(shí)可能會(huì)被覆蓋或修改【不過(guò)事實(shí)上,我一年多以前配的路徑現(xiàn)在還活的好好的,中間經(jīng)歷過(guò)一次大版本,數(shù)次小版本更新】,導(dǎo)致用戶的自定義路徑設(shè)置丟失,而/etc/paths.d/
目錄下的路徑配置通常不會(huì)受到影響。 -
模塊化:如果一個(gè)軟件需要將自己的可執(zhí)行文件路徑添加到全局$PATH中,它可以在/etc/paths.d/目錄下創(chuàng)建一個(gè)獨(dú)立的文件,這樣具有更高的可維護(hù)性,當(dāng)需要安裝、卸載一個(gè)軟件相關(guān)的路徑時(shí),系統(tǒng)只需要?jiǎng)?chuàng)建、刪除一個(gè)單獨(dú)的文件,整個(gè)路徑配置也更加清晰易懂。
用戶級(jí)別
-
~/.bash_profile
、~/.bash_login
、~/.profile
- zsh 下不生效,如果想讓其生效,可以修改
~/.zshrc
,在其中添加如:source ~/.bash_profile
- 語(yǔ)法格式:采用 Shell 命令語(yǔ)法
- 加載時(shí)間:用戶登錄時(shí)加載,根據(jù)存在的文件依次執(zhí)行,優(yōu)先級(jí)為
~/.bash_profile > ~/.bash_login > ~/.profile
。 - 加載原理:在用戶登錄時(shí)按順序查找,按照從前往后的順序讀取,找到第一個(gè)存在的文件并執(zhí)行其中的命令(后面的幾個(gè)文件就會(huì)被忽略了)
是否建議修改:建議在這些文件中進(jìn)行個(gè)性化的環(huán)境設(shè)置,因?yàn)樗鼈冎粚?duì)當(dāng)前用戶有效。 - 建議在這個(gè)文件中設(shè)置用戶級(jí)別的自定義配置,它只影響當(dāng)前用戶的非登錄 shell 環(huán)境
- zsh 下不生效,如果想讓其生效,可以修改
注意:與 Bash 不同,Zsh 并沒(méi)有類似于 Bash 中的 ~/.bash_profile
配置文件。在 Zsh 中,登錄時(shí)的配置任務(wù)主要集中在 ~/.zprofile
文件中。(還有 .zlogin
.zshenv
但是我本機(jī)中并沒(méi)有這些文件)
2. ~/.bashrc
、~/.zshrc
:
- 只在非登錄 shell 中讀取。它通常用于配置終端的行為和設(shè)置用戶自定義的環(huán)境變量。
- 語(yǔ)法格式:采用 Shell 命令語(yǔ)法
- 加載時(shí)間:非登錄shell,打開終端窗口時(shí)加載。
- 加載原理:
~/.bashrc
文件通常由 Bash 非登錄 shell 在啟動(dòng)時(shí)加載。它適用于用戶的自定義配置,只影響當(dāng)前終端會(huì)話。 - 建議在這個(gè)文件中設(shè)置用戶級(jí)別的自定義配置,它只影響當(dāng)前用戶的非登錄 shell 環(huán)境。
登錄 shell 與非登錄 shell
登錄 shell :在用戶登錄系統(tǒng)時(shí)啟動(dòng)的交互式 shell。當(dāng)用戶通過(guò)終端、SSH 或其他方式登錄到系統(tǒng)時(shí),登錄 shell 會(huì)執(zhí)行用戶的登錄配置文件,例如 .bash_profile
等(這些文件根據(jù)所使用的 shell 類型可能有所不同),登錄配置文件通常包含用于設(shè)置環(huán)境變量、執(zhí)行啟動(dòng)腳本以及其他需要在登錄時(shí)進(jìn)行的操作。
非登錄 shell :在已經(jīng)登錄系統(tǒng)的情況下啟動(dòng)的交互式 shell。當(dāng)用戶在登錄后打開新的終端窗口或者運(yùn)行一個(gè) shell 腳本時(shí),會(huì)啟動(dòng)一個(gè)非登錄 shell。非登錄 shell 不會(huì)讀取用戶的登錄配置文件(所以,修改 ~/.bash_login
后需要 source xx 才能生效),而是讀取 ~/.bashrc
或~/.zshrc
等。這些文件通常包含設(shè)置別名、定義函數(shù)、配置 shell 提示符等。
在使用Windows系統(tǒng)時(shí)不會(huì)困惑,因?yàn)閃indows時(shí)典型的單用戶操作系統(tǒng),同時(shí)只允許一個(gè)用戶登錄,但是在使用macOS后,會(huì)比較困惑,到底什么算用戶登錄?我在圖形化界面輸入密碼后按回車?還是每打開一個(gè)終端?困惑的原因也是每次打開終端,都會(huì)有類似 login 的字眼。
通過(guò)幾個(gè)例子來(lái)明確“用戶登錄”的概念,什么算“用戶登錄”,什么算“已經(jīng)登錄”
- 通過(guò)命令行登錄一個(gè)無(wú)圖形化界面的Linux操作系統(tǒng):登錄 shell,沒(méi)什么疑問(wèn)。
- 通過(guò) SSH 遠(yuǎn)程連接云服務(wù)器:登錄 shell。通過(guò) SSH 遠(yuǎn)程登錄到服務(wù)器時(shí),會(huì)啟動(dòng)登錄 shell,并執(zhí)行你的登錄配置文件,以確保你獲得正確的環(huán)境和配置。
- 先通過(guò) SSH 遠(yuǎn)程連接一次云服務(wù)器,同時(shí)連接第二次:每個(gè) SSH 連接都會(huì)啟動(dòng)一個(gè)新的登錄 shell,即使你在同一用戶下打開多個(gè) SSH 連接,它們也是獨(dú)立的登錄 shell。
- 通過(guò)用戶登錄界面登錄圖形化界面 Linux 系統(tǒng):登錄 shell,本質(zhì)上與1相同。
- 通過(guò)用戶登錄界面登錄圖形化界面 Linux 系統(tǒng)后,再打開一個(gè)終端窗口:非登錄 shell,不會(huì)再次執(zhí)行登錄配置文件,所以為了
~/.bash_login
中的配置能夠做到重啟終端生效,我們會(huì)在.bashrc
或.zshrc
中配置source ~/.bash_profile
。 - 使用 su 命令切換用戶:非登錄 shell,不會(huì)執(zhí)行目標(biāo)用戶的登錄配置文件。
- 執(zhí)行 shell 腳本:非登錄 shell,沒(méi)什么疑問(wèn)。
環(huán)境變量加載順序
Mac系統(tǒng)的環(huán)境變量,加載順序?yàn)椋骸具@里僅就常見的幾種方式做順序展示,中間過(guò)程可能會(huì)有一些遺漏】
bash:/etc/profile -> /etc/paths -> /etc/paths.d/ 文件夾所有內(nèi)容 -> ~/.bash_profile -> ~/.bash_login -> ~/.profile -> ~/.bashrc
zsh:/etc/profile -> /etc/paths -> /etc/paths.d/ 文件夾所有內(nèi)容 -> ~/.zprofile -> ~/.zshrc
參考資料
-
Mac中環(huán)境變量加載順序 - 宋建明 - 博客園 (cnblogs.com)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-624123.html
-
osx - Use
/etc/paths
or/etc/paths.d
to add items to the PATH in macOS Sierra? - Unix & Linux Stack Exchange文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-624123.html
到了這里,關(guān)于macOS 環(huán)境變量加載探究的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!