一直使用的是前幾年買的MacBook Air,當時感覺很輕薄,外觀也非常的好看,也是一直用到現在,大概有三四年了,系統還是很流暢(實話,不是打廣告......)。平時也是經常要使用mac的終端,說實話,自從用了mac的終端,基本上跟linux的命令一樣得心應手,再使用windows下的cmd就感覺很別扭,上去就打ls,windows是dir,當然有些命令還是相同的,比如mkdir。
好了,其他的就不多說了,這次出現的問題主要是這一段時間使用mac的終端的時候,發現配置的環境變量總是莫名其妙失效,每次都要source一下,並且source了一下還不夠,每次重新打開終端都要重新source,剛開始也是沒有在意,因為原來一直沒有這個問題,而且平時基本上電腦也是不關機的,不用的時候直接合上,所以也沒有怎么在意。今天再次出現這個問題的時候就打算必須要解決掉,到底為什么?
先是上網百度了一下這個Terminal init時候加載配置文件的順序:
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。
然而,在OS X登錄的時候,並沒有運行着一個shell,所以,在運行Terminal.app的時候,其實那是一個login shell。
你還是可以在bashrc下寫一些配置,只要在bash_profile里source .bashrc就是了。
對於login shell,我也確實在終端的配置中找到了相關答案: 點擊終端的"偏好設置"選項
在通用一欄中可以看到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文件。這些是我當時發現問題和解決問題的思路,可能有些啰嗦,但是我只是想把我整個解決問題的過程和想法分享給其他人,也是總結一下,方便自己,方便他人。