2014-10-17 79 views
2

好像有一百個關於如何改變你的Mac OS X/Linux環境中的路徑的問題....事情是我認爲實際上知道如何改變我的PATH變量,但它似乎是什麼導致它被覆蓋。我使用zsh並試圖讓Brew Doctor不提醒我在user/local/bin之前有usr/bin。 我的〜/ .zprofile:

export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin 
echo $PATH 

並會在登錄我得到:

Last login: Fri Oct 17 15:10:30 on ttys000 
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin 

但在登錄後運行$ PATH我得到:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin 

我直接登錄到zsh,但以防萬一我的.profile和.bash配置文件包含與我的.zprofile相同的代碼,並且我的/etc/paths.d目錄中沒有任何內容。 PATH是否有其他地方?我在這裏錯過了什麼?

+0

導出一個環境變量中,你導出的過程隻影響子進程。一個新的登錄(我假設的終端)不是你剛設置該路徑的shell的子進程,因此沒有設置PATH。 – jrwren 2014-10-18 12:19:16

+0

通常情況下,您不會完全重置個人文件中的PATH值;您只需將目錄添加到從系統配置繼承的值。 – chepner 2014-10-18 12:38:37

+0

@jrwren設置變量的值會影響當前shell; 'export'只是導出一個名稱,以便子環境繼承該值;它不會爲環境帶來價值。 – chepner 2014-10-18 12:41:22

回答

3

讀取.zprofile後,zsh將讀取.zshrc和.zlogin(假設登錄shell)。您的PATH可能會在其中任何一箇中重置。

一般來說,PATH最好在.zshenv中設置(即使shell不是登錄shell也會讀取它)。然後不要將其設置在任何其他啓動文件中。

+1

AHA!非常感謝你!我曾經在某處讀過.zshrc只有在以交互模式使用shell的情況下才能使用(即不是您的登錄shell)。大約一半時間發現導出PATH =/usr/bin:/ bin:/ usr/sbin:/ sbin:/ usr/local/bin。修正了它,它工作! – 2014-10-19 00:58:11

+0

瞭解了.zshenv的提示,並且可以使用登錄和非登錄。輝煌的建議! – 2014-10-19 01:06:10

+1

'〜/ .zshenv'應該是設置PATH的理想場所。但是在OS X和Arch(以及之前的Gentoo)上,執行_after_〜〜/ .zshenv的系統'/ etc/zprofile'將會覆蓋'PATH'變量 - 以解決這個問題,'PATH'和'MANPATH應該把''設置放在'〜/ .zprofile','〜/ .zshrc'和'〜/ .zlogin'等後面的文件中。 – Emanuel 2016-12-21 21:10:03

4

來源: https://wiki.archlinux.org/index.php/zsh

用戶應該注意到,/ etc/profile文件設置$ PATH變量,它 覆蓋任何$ PATH變量在〜/ .zshenv設置。爲防止出現這種情況,請在〜/ .zshrc中設置 $ PATH變量。 (這不是建議更換默認 一行在/ etc/zsh的/ zprofile與其他的東西,它會打破其完整性提供/etc/profile.d中一些腳本的其他包裝物 )

來源: http://shreevatsa.wordpress.com/2008/03/30/zshbash-startup-files-loading-order-bashrc-zshrc-etc/

For zsh: [Note that zsh seems to read ~/.profile as well, if ~/.zshrc is not present.] 

+----------------+-----------+-----------+------+ 
|    |Interactive|Interactive|Script| 
|    |login  |non-login |  | 
+----------------+-----------+-----------+------+ 
|/etc/zshenv  | A  | A  | A | 
+----------------+-----------+-----------+------+ 
|~/.zshenv  | B  | B  | B | 
+----------------+-----------+-----------+------+ 
|/etc/zprofile | C  |   |  | 
+----------------+-----------+-----------+------+ 
|~/.zprofile  | D  |   |  | 
+----------------+-----------+-----------+------+ 
|/etc/zshrc  | E  | C  |  | 
+----------------+-----------+-----------+------+ 
|~/.zshrc  | F  | D  |  | 
+----------------+-----------+-----------+------+ 
|/etc/zlogin  | G  |   |  | 
+----------------+-----------+-----------+------+ 
|~/.zlogin  | H  |   |  | 
+----------------+-----------+-----------+------+ 
|    |   |   |  | 
+----------------+-----------+-----------+------+ 
|    |   |   |  | 
+----------------+-----------+-----------+------+ 
|~/.zlogout  | I  |   |  | 
+----------------+-----------+-----------+------+ 
|/etc/zlogout | J  |   |  | 
+----------------+-----------+-----------+------+ 

Moral: 
For bash, put stuff in ~/.bashrc, and make ~/.bash_profile source it. 
For zsh, put stuff in ~/.zshrc, which is always executed.