大家好土陪,我是良許春寿。
大家都知道光坝,在 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ū)分不同的文件類型并使用戶對文件類型等信息一目了然渣蜗。 |
當(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 |
pushd 和 popd 命令可用的目錄堆棧既峡。 |
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)下跌宛,env
和 printenv
的功能是完全相同的:
$ 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
printenv
與 env
命令只能打印出環(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í)路線圖
也希望有小伙伴能加入我粤攒,把這份電子書做得更完美所森!
有收獲?希望老鐵們來個三連擊琼讽,給更多的人看到這篇文章
推薦閱讀: