設定環境變數的首選位置在哪裡PATH
?
~/.profile
或者/etc/environment
?
PATH
兩處都設定時是什麼狀況?最終結果是在這兩個位置設定的兩個值的串聯嗎?
答案1
概括:
如果您只想為當前使用者而不是電腦的所有使用者新增路徑(例如
/your/additional/path
)到變量,通常會將其放在以下兩個範例之一的PATH
末尾:~/.profile
PATH="/your/additional/path:$PATH" PATH="$PATH:/your/additional/path"
請注意,路徑優先權從左到右遞減,因此第一條路徑具有最高優先權。如果您將路徑新增至 的左側
$PATH
,它將具有最高優先級,並且該位置中的可執行檔將覆蓋所有其他位置。如果您在右側新增路徑,它將具有最低優先級,並且優先選擇來自其他位置的可執行檔。但是,如果您需要為所有用戶設置該環境變量,我仍然不建議觸摸,
/etc/environment
而是創建一個文件名.sh
以/etc/profile.d/
.該/etc/profile
腳本和 中的所有腳本/etc/profile.d
都是每個使用者個人的全域等效腳本~/.profile
,並且在初始化期間由所有 shell 作為常規 shell 腳本執行。
更多詳情:
/etc/environment
是系統範圍的設定文件,這意味著它可供所有使用者使用。但它是由所有者擁有的root
,因此您需要成為管理員使用者並使用它sudo
來修改它。~/.profile
是您自己的使用者的個人 shell 初始化腳本之一。每個使用者都有一個,可以編輯自己的檔案而不影響其他人。/etc/profile
和是相當於每個使用者的/etc/profile.d/*.sh
全域初始化腳本。~/.profile
不過,全域腳本在使用者特定腳本之前執行; main在退出之前/etc/profile
執行所有腳本。*.sh
/etc/profile.d/
該
/etc/environment
文件通常只包含這一行:PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
它將系統上所有使用者的變數設定
PATH
為此預設值,不應對其進行重大更改。至少您不應該從中刪除任何重要路徑,例如/bin
、/sbin
、/usr/bin
和。/usr/sbin
該檔案被每個使用者的每個 shell 作為第一個設定檔之一讀取。請注意,它是不是 shell 腳本。它只是一個以某種方式解析的配置文件,並且可能只包含環境變數分配!
該
~/.profile
文件可以包含很多內容,預設情況下,它包含檢查~/bin
目錄是否存在並將其添加到用戶現有PATH
變量的內容,如下所示(在16.04 之前的較舊Ubuntu 版本上- 無條件添加它- 以及在18.04上) ,其中還添加了“~/.local/bin”):# set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi
您會看到,舊值
PATH
在這裡被重複使用,新路徑僅附加到開頭,而不是覆蓋所有內容。當您想要手動新增路徑時,您也應該始終將舊$PATH
值保留在新字串中的某個位置。這個初始化腳本只能由其所屬使用者的 shell 讀取,但還有另一個條件:
# ~/.profile: executed by the command interpreter for login shells. # This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login # exists.
因此,如果您使用預設的 Bash shell,則應該確保您沒有
~/.bash_profile
或~/.bash_login
如果您希望更改~/.profile
對您的使用者產生影響。
若要全面了解環境變量,請參閱: https://help.ubuntu.com/community/EnvironmentVariables
答案2
這個答案主要是關於
PATH
環境變數的分配順序當在不同的設定檔中指定時。我還介紹了您通常應該在哪裡設置它們,但是下面的列表沒有按照您應該考慮使用它們的順序列出文件。有關PATH
Ubuntu 中設定和其他環境變數的一般信息,我還建議閱讀環境變數以及這個問題的其他答案。
首選設定位置PATH
取決於哪些用戶你需要將其設定為何時以及如何你想要它被設定。您的決定的一部分是您是否想要為所有使用者或每個使用者設定環境變數。如果您不確定,那麼我建議僅為一個使用者(例如您的帳戶)而不是整個系統進行設定。
作為亞歷克斯P 說,PATH
環境變數將具有原來的值最近分配的。在實踐中,最多在您設定的時間中PATH
,您包含老的的值PATH
,以便保留先前的條目。
因此,實際上,當PATH
從多個文件設定 時,它通常包含所有文件中給出的條目。但這只會發生,因為除了第一個檔案之外,所有設定它的檔案通常都會引用該PATH
變數本身,導致其舊值包含在新值中。
PATH
因此,您實際上是在詢問各個文件中的設定生效的順序。
下面列出了常見的、通用的設定位置,PATH
按照使用者登入時生效的順序排列,不是按照您通常應該考慮使用它們的順序。下面列出的每個地方都是合理的設定選擇PATH
在一些情況,但大多時候只有少數是不錯的選擇。
在下面的列表中,您將看到一些目錄名稱,例如~/.profile
.如果你不熟悉波形符擴充,~/
指目前使用者的主目錄。我主要使用這種語法是為了緊湊性。 shell 腳本支援它,但是不是在 PAM 設定檔中。
1. 對於所有使用者:/etc/environment
聚丙烯醯胺在 Ubuntu 上,如果該檔案存在,則會導致設定列出的環境變量/etc/environment
,預設情況下是這樣。這就是所有使用者的環境變數最常見的設定方式。
$ cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
如果必須設定環境變數全部使用者帳戶,而不僅僅是您的使用者帳戶,那麼修改該檔案可能是您的最佳選擇。我建議先備份它。備份此文件的一種方法是運行:
sudo cp /etc/environment /etc/environment.orig
該.orig
擴展名並不是特別需要的——您可以將備份檔案命名為任何不令人困惑或已被使用的名稱。 (此外.orig
,.old
、.backup
和 也.bak
很常見。)
您可以以 root 使用者身分編輯任何其他文件的任何方式編輯此文件(sudoedit /etc/enviromnment
、sudo nano -w /etc/environment
、gksudo gedit /etc/environment
等)
/etc/environment
不支援自動包含變數的舊值。但這通常是不必要的,因為大多數時候您會透過編輯為所有使用者設定環境變量/etc/environment
,無論如何,您都希望它成為使用者登入時的初始值。然後用戶可以根據自己的喜好進行更改。通常,用戶能夠執行此操作是有好處的。
2. 對於所有使用者:/etc/security/pam_env.conf
PAM 從 讀取所有使用者的環境變量/etc/security/pam_env.conf
,使用與每個使用者~/.pam_environment
檔案中使用的語法相同的語法指定(見下文)。
/etc/environment
當在和中設定相同的環境變數時/etc/security/pam_env.conf
,將使用 中的值pam_env.conf
- 即使該值被指定為 asDEFAULT
而不是OVERRIDE
。
但是,當您用environment
one in 取代一行 in時pam_env.conf
,您可以包含被取代值的內容。有關詳細信息,請參閱下面的部分.pam_environment
(因為它使用相同的語法)。
通常不需要編輯pam_env.conf
和如果你這樣做的話你應該要非常小心,由於畸形的行通常會阻止所有普通用戶帳戶登入!例如,預設pam_env.conf
包含以下行:
#PATH DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11
這是作為幾個示例之一呈現的。它說明的事情之一是如何使用 將作業拆分為多行\
。假設您只取消註解第一行,但忘記取消註解第二行:
PATH DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11
不要這樣做!
我只是偶然自己測試了一下,它阻止了任何用戶成功登入。為了解決這個問題,我必須以恢復模式啟動並將其改回來。 (幸運的是,我在僅用於測試的虛擬機器上執行了此操作,因此它沒有給我帶來任何麻煩。)
3. 對於一個使用者:.pam_environment
在使用者的主目錄中
為單一使用者設定環境變數的方法之一是讓該使用者.pam_environment
在其主目錄中編輯(或建立)。該文件中設定的值將取代全域文件中設定的值/etc/environment
。
.pam_environment
不是最初建立使用者帳戶時複製到使用者主資料夾中的檔案框架的一部分。但是,如果您在主目錄中建立該文件,則可以使用它來設定環境變量,例如PATH
.與/etc/environment
(但類似)不同的是/etc/security/pam_env.conf
,每個使用者.pam_environment
檔案確實支援將環境變數的舊值擴展為新值。然而,它們不是 shell 腳本,您必須使用特殊的語法來實現這一點,這與您在.profile
.
例如,如果bin2
您的主目錄中有一個目錄想要新增到 的末尾PATH
,則可以透過將此行新增至 來實現.pam_environment
:
PATH DEFAULT=${PATH}:/home/@{PAM_USER}/bin2
看該~/.pam_environment
小節的環境變數(上面的例子是密切改編的),man pam_env
, 和man pam_env.conf
了解更多詳情。
儘管這曾經被吹捧為 Ubuntu 用戶更改或添加環境變量的首選方式,並且仍然被認為是合理且可接受的選擇,編輯時要小心.pam_environment
。與系統範圍的編輯/etc/security/pam_env.conf
(見上文)一樣,使用者.pam_environment
檔案中格式錯誤的行將阻止登入成功。 (我已經對此進行了測試——這次是故意的。)有關如何進行的信息建議有進化的, 看古納爾·哈爾馬森的評論 以下和這次ubuntu-devel
討論。
這樣的錯誤就沒那麼嚴重了,一般來說,而不是 中的格式錯誤的行pam_env.conf
,因為它只影響一個使用者。然而,對於只有一個允許登入的使用者帳戶的桌面 Ubuntu 系統來說,編輯時出現這樣的錯誤.pam_environment
將與編輯錯誤一樣糟糕pam_env.conf
——如果您還沒有登錄,您將無法進行編輯。從即時USB 等)啟動即可修復此問題。
(如果您確實有其他使用者帳戶,那麼您可以以其他使用者身分登入並解決問題。即使他們不是管理員並且無法sudo
root,他們仍然可以運行並提示輸入您(而不是他們的)密碼。這su your-account
客人但是,帳戶不能執行此操作,因為禁止使用該帳戶su
來冒充其他使用者的身分。
4.對於所有使用者:/etc/profile
以及裡面的文件/etc/profile.d/
Bourne 相容 shell(包括Ubuntu 中的預設使用者 shell)在以登入 shell 呼叫時bash
執行命令。/etc/profile
Ubuntu 的/etc/profile
結尾是:
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
/etc/profile.d/
這會導致目錄中名稱以 結尾的任何檔案中的命令.sh
也被執行。
大多數顯示管理器也會導致 中的命令/etc/profile
(以及 中的檔案/etc/profile.d
)運行以進行圖形登入。然而,並非所有人都這樣做,這是支持使用 PAM 提供的設施的重要論點(請參閱上文)—除非永遠不會有任何圖形登入該系統,例如,如果它是沒有安裝 GUI 的伺服器,則可能會發生這種情況。
傳統上是在 中設定係統範圍的環境變量/etc/profile
,但這通常不再是最佳選擇。如果您無法在 中設定環境變量/etc/environment
,並且必須為所有使用者設定它,那麼在 中 建立新檔案可能/etc/profile.d/
比編輯/etc/profile
自身更好。原因之一是,當Ubuntu升級時,可能會出現一個新的預設/etc/profile
檔。根據您執行升級的方式,將保留舊文件(包含您的更改),放棄特定的更新配置文件,或者係統將提示您處理這種情況。
/etc/profile
當兩個檔案和一個或多個檔案中設定了相同的環境變數時/etc/profile.d
,最後執行哪一個?這取決於/etc/profile
該組中的命令是出現在獲取文件之前還是之後profile.d
(透過我上面引用的程式碼)。中的命令/etc/profile
按照它們出現的順序執行。
/etc/profile
是一個 shell 腳本,並且它的語法是不是與上面討論的 PAM 設定檔相同。其語法與每使用者文件的語法相同~/.profile
(見下文)。
如果您需要編寫這樣的程式碼決定無論是否新增特定目錄PATH
(以及為所有使用者新增),您都將無法使用/etc/environment
或/etc/security/pam_env.conf
執行此操作。這可能是最好使用/etc/profile
or/etc/profile.d/
代替的主要情況。
5. 對於一個使用者:.bash_profile
在使用者的主目錄中
如果使用者有~/.bash_profile
,bash 使用它而不是~/.profile
或~/.bash_login
(見下文)。.bash_profile
您的主目錄中通常不應該有。
如果這樣做,它通常應該包含一個來源命令~/.profile
(例如,. "$HOME/.profile"
)。否則,.profile
根本不會運行每個使用者檔案的內容。
6. 對於一個使用者:.bash_login
在使用者的主目錄中
如果使用者有~/.bash_login
,則 bash 使用它來代替~/.profile
(見下文),除非~/.bash_profile
存在,在這種情況下,除非來自`~/.bash_login,否則不會使用其他任何一個。
與 一樣,您的主目錄中.bash_profile
通常不應有文件。.bash_login
7. 對於一個使用者:.profile
在使用者的主目錄中。
當 Bourne 風格的 shell 作為登入 shell 運行時,它會執行 in 中的命令(通常包括導致運行/etc/profile
in 檔案中的命令的命令——請參閱上文)。之後,它運行用戶主目錄中/etc/profile.d/
的命令。.profile
該文件對於每個使用者都是單獨的。 (Bash 實際上運行.bash_profile
,或者.bash_login
如果它們存在的話 - 但是,對於 Ubuntu 系統上的用戶來說,這些文件很少應該或確實存在。有關詳細信息,請參閱上文和6.2 Bash 啟動文件在Bash 手冊.)
~/.profile
因此,這是使用者放置登入時運行的命令的主要位置。這是您設定 的傳統位置PATH
,但由於 Ubuntu 有 pam_env 模組並支持~/.pam_environment
,您應該考慮使用它。
與 一樣/etc/profile
,並非所有顯示管理器都運行此文件以進行圖形登錄,但大多數顯示管理器都會這樣做。~/.pam_environment
這是更喜歡設定環境變數的原因(正如人們可能更喜歡/etc/environment
的那樣/etc/profile
)。
PATH
當您設定時,您可以擴展環境變量,包括其本身PATH
(請參閱.pam_environment
上文)。但是,如果您需要PATH
以更複雜的方式進行設置,則可能必須使用 your .profile
。特別是,如果您想在每次使用者登入時檢查某個目錄是否存在,並且僅PATH
在存在時將其添加到,那麼您將無法使用您的.pam_environment
檔案將該目錄新增至您的PATH
.
例如,.profile
Ubuntu 上預設的每用戶文件習慣結束於:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
這會檢查您bin
的主目錄是否有子目錄。如果是這樣,它會將該子目錄添加到您的PATH
.
該列表忽略了一些可能性。
使用者登入時還有其他方式設定環境變量,這些方式在很大程度上取決於登入類型。例如,您有時可能會設定僅用於圖形登入或僅用於基於 SSH 的遠端登入的環境變數。上面的列表不包括此類情況。
我遺漏了一些人們有時定義環境變數的文件,例如~/.bashrc
和/etc/bash.bashrc
,因為通常不建議設定它們PATH
,而且您很少應該實際將它們用於此目的。如果您使用這些檔案來新增目錄PATH
,那麼有時它們會被添加多次,並且在您檢查時會非常混亂$PATH
。 (在極端情況下,這可能會減慢速度,但通常這只是保持一切乾淨且易於理解的問題。)
由於bash
是 Ubuntu 用戶的預設登入 shell,並且大多數用戶使用它或其他一些 POSIX 相容 shell,因此我省略了有關如何在其他非 Bourne 風格 shell(例如tcsh
.
答案3
/etc/環境文件不是腳本文件,您不能在那裡使用導出,並且它不支援 $HOME 類型的變數擴展,僅支援 simplevariable=值對。因此,要使用該文件,您只需將路徑附加到現有定義中,該定義專門用於系統範圍的環境變數設定。每行一個。具體來說,該檔案儲存系統範圍的區域設定和路徑設定。
〜/.profile- 每當執行 bash shell 時都會執行此文件,通常是建議的環境變量,但它的缺點是只能由登錄 shell 調用,因此為了使其生效,您需要登出並返回- 或者至少啟動一個新的登錄shell。
答案4
bash 讀取這些文件,但 zsh 不讀取:
全系統
/etc/profile
- 直接編輯它不是一個好主意。
/etc/profile.d/*.sh
- 來源:/etc/profile
會話範圍內
~/.profile
https://help.ubuntu.com/community/EnvironmentVariables#A.2Fetc.2Fprofile.d.2F.2A.sh