記錄 mac下終端內的環境變數問題

2022-04-02 14:23:02 字數 3179 閱讀 5755

一直使用的是前幾年買的macbook air,當時感覺很輕薄,外觀也非常的好看,也是一直用到現在,大概有三四年了,系統還是很流暢(實話,不是打廣告......)。平時也是經常要使用mac的終端,說實話,自從用了mac的終端,基本上跟linux的命令一樣得心應手,再使用windows下的cmd就感覺很彆扭,上去就打ls,windows是dir,當然有些命令還是相同的,比如mkdir。

好了,其他的就不多說了,這次出現的問題主要是這一段時間使用mac的終端的時候,發現配置的環境變數總是莫名其妙失效,每次都要source一下,並且source了一下還不夠,每次重新開啟終端都要重新source,剛開始也是沒有在意,因為原來一直沒有這個問題,而且平時基本上電腦也是不關機的,不用的時候直接合上,所以也沒有怎麼在意。今天再次出現這個問題的時候就打算必須要解決掉,到底為什麼?

mac 一般使用bash作為預設shell

mac系統的環境變數,載入順序為:

/etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc

我的環境變數是配置到 ~/.bash_profile檔案中的,剛開始搜尋時都是一大堆的讓修改 .zshrc 檔案,剛開始的時候確實安裝了這個,後來還是感覺沒有bash原始介面看著習慣就解除安裝掉了,我還以為沒有解除安裝乾淨的問題,找了半天的.zshrc檔案也沒有找到,那就先否定了是這個問題。那麼既然確定了終端初始化時配置檔案的載入順序,就可以一步步定位問題,對於這幾個配置檔案,/etc下面的兩個檔案是系統級別的,系統啟動的時候就會載入,後面幾個是當前使用者級別。後面3個按照從前往後的順序讀取,如果~/.bash_profile檔案存在,則後面的幾個檔案就會被忽略不讀了,如果~/.bash_profile檔案不存在,才會以此類推讀取後面的檔案。~/.bashrc沒有上述規則,它是bash shell開啟的時候載入的。這裡可以推薦乙個大神的部落格,對這些檔案講解的很詳細,這裡我就不再詳細介紹:mac 設定環境變數path的幾種方法

根據上面的規則,看起來~/.bashrc是比較特殊的,是開啟終端就會載入的,而我是把環境變數配置到.bash_profile檔案中,那麼這裡我們可以先測試一下,首先開啟一下.bashrc檔案看一下裡面有什麼。輸入命令:vi ~/.bashrc,發現裡面是空的,然後可以在裡面輸入 echo ".bashrc執行了", 儲存退出。退出終端後重新開啟,發現並沒有輸出 ".bashrc執行了"這句話,這是不是跟上面的規則違背了呢? 於是我再次搜尋,在另乙個大佬的文章中找到了答案:

mac os x 環境變數設定*** – helix的日誌 – 網易部落格

「os x 和 linux 都有 .bash_profile 和 .bashrc 這兩個配置檔案。

但是,在os x裡會遇到bashrc不生效的情況。

當shell是login shell,.bash_profile才會載入,而bashrc正好相反。

真正的區別是在linux下,當使用者登入到乙個圖形介面,然後開啟乙個終端terminal,那些shell是non-login shell。

你還是可以在bashrc下寫一些配置,只要在bash_profile裡source .bashrc就是了。

在通用一欄中可以看到shell的開啟方式 "預設登入shell"。剛開始時我發現我選擇的是"命令(完整的路徑)",在這種方式下並不會先載入".bash_profile"檔案,這是我後來改過後發現可以保證.bash_profile檔案在開啟時就載入。

選擇shell的開啟方式為"預設登入shell"後,測試一下,看看終端是否是開啟載入。首先在.bash_profile檔案中寫入 echo ".bash_profile檔案執行了" ,儲存退出後關閉終端重新開啟。

發現.bash_profile現在確實是在終端開啟時就先讀取了,而剛才的.bashrc檔案是沒有在開啟時載入的,那麼如果我的環境變數想配置到.bashrc檔案中,我們可以在.bash_profile檔案中寫入"source ~/.bashrc",因為終端開啟時優先載入.bash_profile,載入到"source ~/.bashrc"這一句時會去載入 .bashrc檔案,這樣就可以保證配置在 .bashrc檔案中的環境變數可以被載入到,下面可以測試一下:

1  .bash_profile檔案中寫入 echo ".bash_profile檔案執行了" 和 "source ~/.bashrc"  

2 .bashrc檔案寫入 echo ".bashrc檔案執行了"

關閉終端後重新開啟:

可以清楚的看到,開啟終端後先輸出了".bash_profile檔案執行了",然後輸出".bashrc檔案執行了",這表明終端載入檔案的順序是先載入.bash_profile檔案,而在.bash_profile檔案中又source了.bashrc檔案,因此使得載入.bash_profile檔案的時也載入了.bashrc檔案,這樣即使你的環境變數是配置在.bashrc中的也可以正確的執行。輸入env可以檢視你當前配置的環境變數等資訊。

總結:這次解決問題也是查了很多部落格和帖子,千篇一律的也是一大堆,當時我搜尋的是「mac下為什麼每次開啟終端都必須要重新source .bash_profile」,搜到的全是說你安裝了zsh,啟動終端時會讀取.zshrc配置檔案,這個也許說的都是對的,但不符合我的情況也不是我想要的,那麼這種情況就應該仔細的分析一下,換一種思路去解答這個問題,首先每一次開啟終端都必須要手動source一下.bash_profile檔案,說明終端啟動時沒有讀取這個檔案,那麼我當時就搜一下,mac下終端啟動時環境變數配置檔案的載入順序,再加上這個問題原來是沒有出現的,說明原來是管用的,說明將環境變數配置到.bash_profile檔案中是沒有問題的,到此問題就縮小到,為什麼終端啟動時沒有讀取.bash_profile檔案。這些是我當時發現問題和解決問題的思路,可能有些囉嗦,但是我只是想把我整個解決問題的過程和想法分享給其他人,也是總結一下,方便自己,方便他人。

MAC下使用終端配置gradle環境變數

gradle在android studio開發過程中使用的地方非常多,除了一系列task外,還可以直接結合eclipse使用,但必須先配置乙個gradle環境,因為要執行gradle命令 1,解壓gradle到指定資料夾,這裡使用 users abc documents gradle 2.8 2,在...

MAC下環境變數配置

本文以新增adb命令為例,其他同理 1.開啟終端 在應用程式 實用工具下 2.vim bash profile 3.按一下 i 進入編輯模式 在這裡輸入 export path users user android sdks platform tools users user android sdk...

MAC下配置環境變數

mac系統的環境變數,載入順序為 etc profile 系統級別 etc paths 系統級別 bash profile 使用者級別 1 bash login 使用者級別 2 profile 使用者級別 3 bashrc bash shell開啟時載入 一般情況下前兩個都不要去做修改,只要改使用者...