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