設(shè)置與查看Linux系統(tǒng)中的環(huán)境變量

大家好土陪,我是良許春寿。

大家都知道光坝,在 Linux 系統(tǒng)中尸诽,有環(huán)境變量Shell 變量這兩種變量。

環(huán)境變量是在程序及其子程序中全局可用的盯另,常常用來儲存像默認的文本編輯器或者瀏覽器性含,以及可執(zhí)行文件的路徑等等這樣的信息。而 Shell 變量僅在當(dāng)前 Shell 中可用土铺,可以用來存儲當(dāng)前用戶的 ID 等信息胶滋。

那么什么是環(huán)境變量板鬓,什么是 Shell 變量,該如何設(shè)置和查看這兩種變量呢究恤?

接下來俭令,讓良許為你解答:

環(huán)境變量

環(huán)境變量是以鍵值對的形式實現(xiàn)的,是在整個系統(tǒng)范圍內(nèi)都可用的變量部宿,并由所有派生的子進程和 Shell 繼承抄腔。而環(huán)境變量的名稱是區(qū)分大小寫的,且通常以大寫的形式命名 ( MYVAR1, MYVAR2... )

單個值的環(huán)境變量看起來是這樣的:

KEY=value1

如果你想要將多個值賦予環(huán)境變量理张,則通常用冒號 ( : ) 作為分隔符赫蛇。每一對鍵值對最終看起來是這樣子的:

KEY=value1:value2:value3

如果要賦予環(huán)境變量的值包含空格,則需要使用引號:

KEY="value with spaces"

Shell 變量

Shell 變量是專門用于設(shè)置或定義它們的 Shell 中的變量雾叭。每個 Shell 悟耘,例如 zsh 和 bash ,都有一組自己內(nèi)部的 Shell 變量织狐。它們通常用于跟蹤臨時數(shù)據(jù)暂幼,比如當(dāng)前工作目錄,而用法則與環(huán)境變量相同移迫。

如果你想讓 Shell 變量作為全局變量使用旺嬉,可以使用 export 指令:

$ export MYVAR=lxlinux.net
$ echo $MYVAR
lxlinux.net
$ env | grep MYVAR
MYVAR=lxlinux.net

常見的環(huán)境變量與 Shell 變量

一些環(huán)境變量和 Shell 變量是非常有用的,并且經(jīng)常會被引用厨埋。以下是一些常見的邪媳,你以后可能會遇到的環(huán)境變量:

變量名 含義
TERM 這指定運行 Shell 時要模擬的終端類型〉聪荩可以針對不同的操作需求模擬不同的硬件終端雨效。不過,你通常不需要管這個變量废赞。
USER 當(dāng)前登錄的用戶
PWD 當(dāng)前的工作目錄
OLDPWD 上一個工作目錄设易,這個變量由 Shell 保存,以便通過執(zhí)行 cd - 切換回上一個工作目錄蛹头。
LS_COLORS 這定義了 ls 指令的顏色輸出代碼顿肺,用于向 ls 指令添加顏色輸出。這通常用于區(qū)分不同的文件類型并使用戶對文件類型等信息一目了然渣蜗。
MAIL 當(dāng)前用戶郵箱的路徑
PATH 系統(tǒng)在查找指令時會檢查的目錄列表屠尊。當(dāng)用戶輸入一個指令時,系統(tǒng)將按此目錄列表的順序檢查目錄耕拷,以尋找相應(yīng)的可執(zhí)行文件讼昆。
LANG 當(dāng)前的語言和本地化設(shè)置,包括字符編碼骚烧。
HOME 當(dāng)前用戶的主目錄
_ 上一個被執(zhí)行的指令

除了以上這些環(huán)境變量浸赫,你也可能會經(jīng)常遇到以下這些 Shell 變量:

變量名 含義
BASHOPTS 執(zhí)行 bash 時所啟用的選項列表闰围,這對于確定 Shell 環(huán)境是否按照預(yù)期的方式運行很有幫助。
BASH_VERSION 人類可讀格式的正在執(zhí)行的 bash 版本
BASH_VERSINFO 機器可讀格式的正在執(zhí)行的 bash 版本
COLUMNS 用于設(shè)置繪制到屏幕上的輸出信息的寬的列數(shù)
DIRSTACK pushdpopd 命令可用的目錄堆棧既峡。
HISTFILESIZE 存儲到文件中的命令歷史記錄的行數(shù)羡榴。默認為 ~/.bash_history 文件的行數(shù)。
HISTSIZE 內(nèi)存中允許存儲的命令歷史記錄的行數(shù)运敢,即 histroy 命令所能打印出來的行數(shù)校仑。
HOSTNAME 計算機的主機名
IFS 內(nèi)部字段分隔符,用于分隔命令行上的輸入传惠。 默認以空格作為分隔符迄沫。
PS1 定義主命令提示符。 這用于定義啟動 Shell 會話時命令提示符的外觀卦方。而 PS2 用于聲明跨越多行的命令的命令提示符羊瘩。
SHELLOPTS 可以用 set 命令設(shè)置的 Shell 選項。
UID 當(dāng)前用戶的 UID (用戶 ID)

查看 Shell 變量與環(huán)境變量

在 Linux 系統(tǒng)中盼砍,有以下幾種命令可以讓你查看環(huán)境變量:

env — 該命令可以讓你在自定義的環(huán)境中運行程序困后,并且不需要改變當(dāng)前的環(huán)境。當(dāng)不帶參數(shù)使用 env 命令時衬廷,它會打印出當(dāng)前的環(huán)境變量列表。

printenv — 可以打印出所有的或者指定的環(huán)境變量汽绢。

set — 該命令可以設(shè)置或者刪除 Shell 變量吗跋。當(dāng)不帶參數(shù)使用 set 命令時,它將打印出包括環(huán)境變量與 Shell 變量在內(nèi)的所有變量以及 Shell 函數(shù)的列表宁昭。

默認狀態(tài)下跌宛,envprintenv 的功能是完全相同的:

$ printenv 
SSH_CONNECTION=10.0.2.2 37182 10.0.2.15 22
LESSCLOSE=/usr/bin/lesspipe %s %s
LANG=C.UTF-8
XDG_SESSION_ID=5
USER=alvin
MYVAR=lxlinux.net
PWD=/home/alvin
HOME=/home/alvin
SSH_CLIENT=10.0.2.2 37182 22
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
SSH_TTY=/dev/pts/0
MAIL=/var/mail/alvin
TERM=xterm-256color
SHELL=/bin/bash
SHLVL=1
LOGNAME=alvin
XDG_RUNTIME_DIR=/run/user/1000
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
LESSOPEN=| /usr/bin/lesspipe %s
_=/usr/bin/printenv

只有在更具體的功能上才能體現(xiàn)出 env 命令與 printenv 命令的區(qū)別。例如积仗,使用 printenv 命令疆拘,你可以請求單個變量的值:

$ printenv SHELL
/bin/bash
$ printenv HOME
/home/alvin
$ printenv MYVAR
lxlinux.net

env 命令可通過將一組變量傳遞給命令來修改程序運行的環(huán)境:

env MYVAR=lxlinux.net command_to_run command_options

printenvenv 命令只能打印出環(huán)境變量,而如果你想打印出所有變量或者 Shell 函數(shù)的列表寂曹,你可以使用 set 指令哎迄。

$ set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_VERSINFO=([0]="2" [1]="8")
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="4" [2]="20" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='4.4.20(1)-release'
COLUMNS=140
DIRSTACK=()
EUID=1000
GROUPS=()
HISTCONTROL=ignoreboth
HISTFILE=/home/alvin/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/home/alvin
HOSTNAME=ubuntu-bionic
HOSTTYPE=x86_64
IFS=$' \t\n'
LANG=C.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
LINES=35
LOGNAME=alvin
.....

該命令將顯示一個包含所有變量的大列表,因此你可能會希望將輸出傳遞給 less 命令隆圆。

$ set | less

設(shè)置 Shell 變量與環(huán)境變量

Linux 系統(tǒng)中可以設(shè)置環(huán)境變量的命令有以下幾種:

set — 該命令可以設(shè)置或者取消設(shè)置 Shell 變量漱挚。當(dāng)不帶參數(shù)使用 set 命令時,它將打印出包括環(huán)境變量與 Shell 變量在內(nèi)的所有變量以及 Shell 函數(shù)的列表渺氧。

unset — 該命令可以刪除 Shell 變量以及環(huán)境變量旨涝。

export — 該命令可以設(shè)置環(huán)境變量。

為了更好地理解 Shell 變量和環(huán)境變量之間的區(qū)別侣背,我們先從設(shè)置 Shell 變量開始講白华,然后再講環(huán)境變量慨默。

先從在當(dāng)前會話中定義一個 Shell 變量開始:

$ MYVAR=lxlinux

你可以用 echo $MYVAR 來驗證變量是否已設(shè)置:

$ echo $MYVAR
lxlinux

使用 printenv 命令檢驗該變量是否為環(huán)境變量:

$ printenv MYVAR

沒有輸出返回,這就意味著 MYVAR 變量并不是環(huán)境變量弧腥。

export 命令可以用來設(shè)置環(huán)境變量厦取。要創(chuàng)建環(huán)境變量,只需用 export 命令將 Shell 變量導(dǎo)出為環(huán)境變量:

$ export MYVAR

你可以用以下語句檢驗:

$ printenv MYVAR
lxlinux

當(dāng)然鸟赫,你也可以只用一行代碼來設(shè)置環(huán)境變量:

$ export MYNEWVAR="My New Variable"

但是以這種方式創(chuàng)建的環(huán)境變量只能用于當(dāng)前會話蒜胖,如果你打開一個新的 Shell 會話,或者退出登陸抛蚤,所有的變量都將會丟失台谢。

我們也可以將環(huán)境變量還原為 Shell 變量,或者將其完全刪除:

MYVAR 變量被定義為環(huán)境變量岁经,我們可以通過輸入以下代碼將其還原為 Shell 變量:

$ export -n MYVAR

這樣朋沮,MYVAR 變量就不再是環(huán)境變量了,但依然還是 Shell 變量缀壤。

無論是 Shell 變量還是環(huán)境變量樊拓,想要完全刪除變量,都可以使用 unset 命令來刪除:

$ unset MYVAR

可以通過以下語句來驗證 MYVAR 變量已經(jīng)刪除:

$ echo $MYVAR

由于變量已經(jīng)刪除了塘慕,所以沒有任何返回筋夏。

環(huán)境變量的持久化

許多程序都需要使用環(huán)境變量來決定具體的執(zhí)行方式,但是图呢,我們并不希望每次啟動新的 Shell 會話時都必須重新設(shè)置重要的變量条篷,因此我們需要將重要的環(huán)境變量寫入配置文件中。

Shell 會話有不同的啟動方式蛤织,比如赴叹,連接到終端的交互式 Shell 與未連接到終端的非交互式 Shell,還有登錄式 Shell 與非登錄式 Shell指蚜, 而 bash Shell 會根據(jù)會話不同的啟動方式而讀取不同的配置文件乞巧。

但是,在大多數(shù) Linux 發(fā)行版中摊鸡,當(dāng)你啟動一個新的 Shell 會話時绽媒,一般都會從以下文件中讀取環(huán)境變量:

/etc/environment — 使用此文件來設(shè)置系統(tǒng)范圍內(nèi)可用的環(huán)境變量。

/etc/profile — 每當(dāng) bash 登錄 Shell 時免猾,都會加載此文件中設(shè)置的變量些椒。

~/.bashrc — 每個用戶特定的 Shell 配置文件。例如掸刊, 如果你使用的是Bash免糕,就可以在其中聲明變量。

如果要將新的環(huán)境變量加載到當(dāng)前的 Shell 會話中,可以使用source命令:

$ source ~/.bashrc

如果你想要設(shè)置環(huán)境變量石窑,你就可以考慮將其添加到 /etc/profile 牌芋、/etc/bash.bashrc/etc/environment 文件中。

結(jié)論

在本文章中松逊,我們了解了一些常見的環(huán)境變量和 Shell 變量躺屁,也學(xué)習(xí)了如何設(shè)置和查看這些變量,其實這些變量一直都在我們的 Shell 會話中经宏,而且對許多程序都很有用犀暑,有很多常見的場景都會引用到這些變量。希望這對你的工作也有幫助烁兰。如果你還對這兩種變量有任何疑問耐亏,請留言告訴我唄!


最后沪斟,最近很多小伙伴找我要Linux學(xué)習(xí)路線圖广辰,于是我根據(jù)自己的經(jīng)驗,利用業(yè)余時間熬夜肝了一個月主之,整理了一份電子書择吊。無論你是面試還是自我提升,相信都會對你有幫助槽奕!目錄如下:

免費送給大家几睛,只求大家金指給我點個贊!

電子書 | Linux開發(fā)學(xué)習(xí)路線圖

也希望有小伙伴能加入我粤攒,把這份電子書做得更完美所森!

有收獲?希望老鐵們來個三連擊琼讽,給更多的人看到這篇文章

推薦閱讀:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市洪唐,隨后出現(xiàn)的幾起案子钻蹬,更是在濱河造成了極大的恐慌,老刑警劉巖凭需,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件问欠,死亡現(xiàn)場離奇詭異,居然都是意外死亡粒蜈,警方通過查閱死者的電腦和手機顺献,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枯怖,“玉大人注整,你說我怎么就攤上這事。” “怎么了肿轨?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵寿冕,是天一觀的道長。 經(jīng)常有香客問我椒袍,道長驼唱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任驹暑,我火速辦了婚禮玫恳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘优俘。我一直安慰自己京办,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布兼吓。 她就那樣靜靜地躺著臂港,像睡著了一般。 火紅的嫁衣襯著肌膚如雪视搏。 梳的紋絲不亂的頭發(fā)上审孽,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音浑娜,去河邊找鬼佑力。 笑死,一個胖子當(dāng)著我的面吹牛筋遭,可吹牛的內(nèi)容都是我干的打颤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼漓滔,長吁一口氣:“原來是場噩夢啊……” “哼编饺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起响驴,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤透且,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后豁鲤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秽誊,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年琳骡,在試婚紗的時候發(fā)現(xiàn)自己被綠了锅论。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡楣号,死狀恐怖最易,靈堂內(nèi)的尸體忽然破棺而出怒坯,到底是詐尸還是另有隱情,我是刑警寧澤耘纱,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布敬肚,位于F島的核電站,受9級特大地震影響束析,放射性物質(zhì)發(fā)生泄漏艳馒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一员寇、第九天 我趴在偏房一處隱蔽的房頂上張望弄慰。 院中可真熱鬧,春花似錦蝶锋、人聲如沸陆爽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慌闭。三九已至,卻和暖如春躯舔,著一層夾襖步出監(jiān)牢的瞬間驴剔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工粥庄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留丧失,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓惜互,卻偏偏與公主長得像布讹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子训堆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354