Linux環境變量詳解
環境變量是操作系統環境設置的變量,適用于整個系統的用戶進程。
環境變量分類
按照權限分類
- 系統級:系統級的環境變量是每個登錄到系統的用戶都要讀取的系統變量
- 用戶級:用戶級的環境變量則是該用戶使用系統時加載的環境變量
按照生存周期分類
- 永久的:需要修改配置文件,變量永久生效
- 臨時的:使用export命令聲明即可,變量在關閉shell時失效
Linux環境變量文件
環境變量文件簡介
linux變量文件有/etc/environment
、 /etc/profile
、 ~/.profile
、 /etc/bash.bashrc
、 ~/.bashrc
, 以及~/.bash_profile
,~/.bash_logout
.
注意在每臺機器中,這些配置文件并不是全都有,其中有些是必須的,有些是幾個里面有一個,具體的介紹請往下看。
系統級
-
/etc/environment:是系統在登錄時讀取的第一個文件,該文件設置的是整個系統的環境,只要啟動系統就會讀取該文件,用于為所有進程設置環境變量。系統使用此文件時并不是執行此文件中的命令,而是根據而是根據KEY=VALUE模式的代碼,對KEY賦值以VALUE,因此文件中如果要定義PATH環境變量,只需加入一行形如 PATH=$PATH:/xxx/bin的代碼即可
-
/etc/profile:此文件是系統登錄時執行的第二個文件。 為系統的每個用戶設置環境信息,當用戶第一次登錄時,該文件被執行。并從/etc/profile.d目錄的配置文件中搜集shell的設置。(/etc/profile可以用于設定針對全系統所有用戶的環境變量,環境變量周期是永久性)
-
/etc/bashrc:是針對所有用戶的bash初始化文件,在此中設定的環境變量將應用于所有用戶的shell中,此文件會在用戶每次打開shell時執行一次。(即每次新開一個終端,都會執行/etc/bashrc)。
用戶級
(這些文件處于主目錄下)
-
~/.profile:對應當前登錄用戶的profile文件,用于定制當前用戶的個人工作環境(變量是永久性),每個用戶都可使用該文件輸入專用于自己使用的shell信息,當用戶登錄時,該文件僅僅執行一次!默認情況下,他設置一些環境變量,執行用戶的.bashrc文件。這里是推薦放置個人設置的地方
-
~/.bashrc:該文件包含專用于你的bash shell的bash信息,當登錄時以及每次打開新的shell時,該文件被讀取。(~/.bashrc只針對當前用戶,變量的生命周期是永久的)
-
~/.bash_profile or ~/.bash_login or /.profile。**/.bash_profile是交互式login方式進入 bash 運行的,~/.bashrc 是交互式 non-login 方式進入 bash 運行的。通常二者設置大致相同,所以通常前者會調用后者。**每個用戶都可使用該文件輸入專用于自己使用的shell信息,當用戶登錄時,該文件僅僅執行一次。默認情況下,他設置一些環境變量,執行用戶的.bashrc文件。(如果~/目錄下沒有.bash_profile則新建立一個)
當一個shell關閉時,在bash_profile中定義的系統變量則會失效。因此,每打開一個新的shell時都要運行一次source bash_profile.而且針對當前用戶。
-
~/.pam_environment:用戶級的環境變量設置文件,沒有做測試,不知道管不管用。
-
~/.bash_logout:當每次退出系統(退出bash shell)時,執行該文件。另外,/etc/profile中設定的變量(全局)的可以作用于任何用戶,而~/.bashrc等中設定的變量(局部)只能繼承 /etc/profile中的變量,他們是"父子"關系。
環境變量文件的執行順序
在登錄Linux時要執行文件的過程如下:
在剛登錄Linux時,首先啟動 /etc/profile 文件,然后再啟動用戶目錄下的 ~/.bash_profile、 ~/.bash_login或 /.profile文件中的其中一個,用戶主目錄下文件的執行的順序為:/.bash_profile -> ~/.bash_login -> ~/.profile。
如果 ~/.bash_profile文件存在的話,一般還會執行 ~/.bashrc文件。
因為在 ~/.bash_profile文件中一般會有下面的代碼:
if [ -f ~/.bashrc ] ; then. ./bashrc
fi
~/.bashrc中,一般還會有以下代碼:if [ -f /etc/bashrc ] ; then. /etc/bashrc
fi
所以,~/.bashrc會調用 /etc/bashrc文件。最后,在退出shell時,還會執行 ~/.bash_logout文件。
所以整體的執行順序為: /etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) -> ~/.bashrc -> /etc/bashrc -> ~/.bash_logout
各種環境變量設置文件順序的用處
1)先將 export LANG=zh_CN加入/etc/profile,退出系統重新登錄,登錄提示顯示英文。
2)先將 /etc/profile 中的export LANG=zh_CN刪除,將LNAG=zh_CN加入 /etc/environment,退出系統重新登錄,登錄提示顯示中文。
用戶環境建立的過程中總是先執行 /etc/profile,然后再讀取 /etc/environment。
為什么會有如上所敘的不同呢?而不是先執行/etc/environment,后執行/etc/profile呢?
這是因為: /etc/environment是設置整個系統的環境,而/etc/profile是設置所有用戶的環境,前者與登錄用戶無關,后者與登錄用戶有關。
系統應用程序的執行與用戶環境可以是無關的,但與系統環境是相關的,所以當你登錄時,你看到的提示信息,如日期、時間信息的顯示格式與系統環境的LANG是相關的,缺省LANG=en_US,如果系統環境LANG=zh_CN,則提示信息是中文的,否則是英文的。
對于用戶的shell初始化而言是先執行/etc/profile,再讀取文件/etc/environment;對整個系統而言是先執行/etc/environment。這樣理解正確嗎?
登陸系統時的順序應該是:
/etc/enviroment --> /etc/profile -->$HOME/.profile??>$HOME/.env (如果存在)
/etc/profile 是所有用戶的環境變量
/etc/enviroment是系統的環境變量
登陸系統時shell讀取的順序應該是:
/etc/profile ->/etc/enviroment -->$HOME/.profile??>$HOME/.env
原因應該是用戶環境和系統環境的區別了,如果同一個變量在用戶環境(/etc/profile)和系統環境(/etc/environment)有不同的值,那應該是以用戶環境為準了。
常用環境變量介紹
PATH
PATH是可執行文件的搜索路徑,是我們最常接觸到的,因為我們命令行中的每句能運行的命令,如ls
、top
、ps
等,都是系統通過PATH找到了這個命令執行文件的所在位置,再run這個命令(可執行文件)。
查看PATH環境變量,可以直接用echo $PATH
,輸出的結果是以冒號分隔的;為了改善可讀性,我們可以將冒號替換為換行符:echo $PATH | sed "s/:/\n/g"
。詳見Linux中的awk、sed、grep及正則表達式詳解中的例子。
LIBRARY_PATH和LD_LIBRARY_PATH
這兩個路徑可以放在一起討論,
- LIBRARY_PATH是程序編譯期間查找動態鏈接庫時指定查找共享庫的路徑
- LD_LIBRARY_PATH是程序加載運行期間查找動態鏈接庫時指定除了系統默認路徑之外的其他路徑
兩者的共同點是庫,庫是這兩個路徑和PATH路徑的區別,PATH是可執行文件。
兩者的差異點是使用時間不一樣。一個是編譯期,對應的是開發階段,如gcc編譯;一個是加載運行期,對應的是程序已交付的使用階段。
LD_PRELOAD
LD_PRELOAD是Linux系統的一個環境變量,它可以影響程序的運行時的鏈接(Runtime linker),它允許你定義在程序運行前優先加載的動態鏈接庫,一方面,我們可以以此功能來使用自己的或是更好的函數(比如,你可以使用Google開發的tcmalloc來提升效率),而另一方面,我們也可以向別人的程序注入程序,從而達到特定的目的。
PS1
PS1環境變量用于改變終端的提示符。比如:
export PS1="$ "
其他環境變量
注意以上也不是窮舉列出了環境變量,而是除了上面最常用的幾個之外,另外一些比較常用的。
$HOME
用戶家目錄$LOGNAME
當前用戶的登錄名$HOSTNAME
主機的名稱$SHELL
用戶在使用的Shell解釋器名稱$HISTSIZE
輸出的歷史命令記錄條數$HISTFILESIZE
保存的歷史命令記錄條數PS2
附屬提示符$MAIL
郵件保存路徑$LANG
系統語言、語系名稱$RANDOM
生成一個隨機數字$EDITOR
用戶默認的文本編輯器
查看和修改環境變量的命令
Linux也提供了修改和查看環境變量的命令!下面通過幾個實例來說明:
-
echo
顯示某個環境變量值echo $PATH
-
export
設置一個新的環境變量export HELLO=hello
,在shell的命令行下直接使用[export 變量名=變量值] 定義變量,該變量只在當前的shell(BASH)或其子shell(BASH)下是有效的,shell關閉了,變量也就失效了,再打開新shell時就沒有這個變量,需要使用的話還需要重新定義。要想在永久地修改環境變量,需要像上面一樣在變量文件中export。 -
env
顯示所有環境變量 -
set
顯示本地定義(系統中已經存在)的shell變量以及設置shell變量的新變量值,如果未指定值,則該變量值將被設為NULL。 -
unset
清除環境變量unset HELLO
-
readonly
設置只讀環境變量readonly HELLO
,如果使用了readonly命令的話,變量就不可以被修改或清除了。
更改方式
在當前shell中改變環境變量
直接在當前shell中執行:
export PS1="$ "
永久改變環境變量
將環境變量修改的命令添加到配置文件中,這樣每次新打開的shell也會時想要的環境變量配置了。
vim ~/.bashrc
export PS1="$ " # 將這一句添加到最后
Ref:
https://www.imooc.com/article/43747
http://blog.itpub.net/69979681/viewspace-2743590/
https://blog.csdn.net/u010533843/article/details/54986646