一文理解環(huán)境變量

一文理解環(huán)境變量

對(duì)于Linux初學(xué)者來(lái)說(shuō),環(huán)境變量是個(gè)很陌生的名詞,很多人不能理解它是到底是什么,可以用來(lái)干嘛。其實(shí),環(huán)境變量,在windows中也有,只是我們平時(shí)不怎么直接接觸它,所以我們下面也只針對(duì)Linux來(lái)講環(huán)境變量。

什么是環(huán)境變量

首先,在百度百科中,環(huán)境變量的解釋是這樣的:

環(huán)境變量(environment variables)一般是指在操作系統(tǒng)中用來(lái)指定操作系統(tǒng)運(yùn)行環(huán)境的一些參數(shù),如:臨時(shí)文件夾位置和系統(tǒng)文件夾位置等。
環(huán)境變量是在操作系統(tǒng)中一個(gè)具有特定名字的對(duì)象,它包含了一個(gè)或者多個(gè)應(yīng)用程序所將使用到的信息。例如Windows和DOS操作系統(tǒng)中的path環(huán)境變量,當(dāng)要求系統(tǒng)運(yùn)行一個(gè)程序而沒(méi)有告訴它程序所在的完整路徑時(shí),系統(tǒng)除了在當(dāng)前目錄下面尋找此程序外,還應(yīng)到path中指定的路徑去找。用戶通過(guò)設(shè)置環(huán)境變量,來(lái)更好的運(yùn)行進(jìn)程。

描述性文字理解起來(lái)還是太抽象了,我們還是用幾個(gè)簡(jiǎn)單的例子,來(lái)學(xué)習(xí)一下環(huán)境變量吧

首先,我們登陸上服務(wù)器,然后輸入ls命令:

vip18 10:06:09 ~
$ ls
readme.txt

可以看到,在當(dāng)前用戶vip18的家目錄~下,有一個(gè)文件叫readme.txt,但是,當(dāng)前目錄下面并沒(méi)有ls命令所對(duì)應(yīng)的可執(zhí)行文件。真正的ls命令的可執(zhí)行文件,其實(shí)是在別處,我們用which ls可以查看到ls所在的位置:

vip18 10:06:13 ~
$ which ls
/bin/ls

可以看到,ls其實(shí)是保存在/bin/ls這個(gè)目錄下的。而我們之所以可以隨時(shí)隨地的調(diào)用ls,是因?yàn)?strong>當(dāng)要求系統(tǒng)運(yùn)行一個(gè)程序而沒(méi)有告訴它程序所在的完整路徑時(shí),系統(tǒng)除了在當(dāng)前目錄下面尋找此程序外,還應(yīng)到path中指定的路徑去找。接下來(lái)我們看看當(dāng)前的環(huán)境變量PATH是什么,用echo $PATH可以查看到

vip18 10:11:28 ~
$ echo $PATH
/trainee/vip18/bin:/trainee/vip18/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

可以看到,PATH記錄的是很多個(gè)目錄,這些目錄以冒號(hào):作分割,為了讓大家看的清楚,我們把冒號(hào):替換成\n

vip18 10:27:59 ~
$ echo $PATH|tr ':' '\n'
/trainee/vip18/bin
/trainee/vip18/.local/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin

其實(shí),PATH就是記錄了很多以bin或者sbin為結(jié)尾的目錄,這些目錄下面就包涵了很多可執(zhí)行文件,比如我們上面提到的ls命令所在的目錄/bin就是倒數(shù)第4個(gè)。感興趣的可以去看看其他命令對(duì)應(yīng)的可執(zhí)行文件都記錄在哪個(gè)目錄里面,這里不再展示。

如何修改環(huán)境變量

修改環(huán)境變量,其實(shí)就是對(duì)環(huán)境變量進(jìn)行重新賦值,比如我們安裝了一個(gè)軟件叫aspera

# 下載
wget -c https://download.asperasoft.com/download/sw/connect/3.8.1/ibm-aspera-connect-3.8.1.161274-linux-g2.12-64.tar.gz
# 解壓
tar zxvf ibm-aspera-connect-3.8.1.161274-linux-g2.12-64.tar.gz
# 安裝
bash ibm-aspera-connect-3.8.1.161274-linux-g2.12-64.sh

這個(gè)軟件安裝好了之后,會(huì)在用戶的家目錄下的生成一個(gè)隱藏目錄.aspera,需要用ls -a來(lái)查看

1561603894085.png

進(jìn)一步查看這個(gè)目錄的結(jié)構(gòu):

1561603993164.png

發(fā)現(xiàn)它的下下層目錄也有一個(gè)叫bin的目錄,包涵的可執(zhí)行文件有

$ ls .aspera/connect/bin/
ascp  asperaconnect  asperaconnect.bin  asperacrypt  asunprotect

假如我們想像調(diào)用ls那樣隨時(shí)隨地的調(diào)用這個(gè)軟件的命令,即~/.aspera/connect/bin/目錄中的可執(zhí)行文件,那么就需要把這個(gè)路徑添加到環(huán)境變量里面去,方法是:

export PATH="~/.aspera/connect/bin/:$PATH"
# 注意這里要用雙引號(hào),不能用單引號(hào)

運(yùn)行上面這一行命令之后,就可以隨時(shí)隨地得調(diào)用了,如:

1561604559848.png

但是,這方法并不能一勞永逸,我們需要把它寫(xiě)進(jìn)去.bashrc里面去

.bashrc文件

.bashrc是一個(gè)配置文件,也是一個(gè)隱藏文件,存在于用戶的家目錄~下,需要用ls -a才能查看到,當(dāng)我們每次登陸服務(wù)器時(shí),這個(gè)文件就會(huì)被執(zhí)行一次,也就是說(shuō)文件內(nèi)的代碼會(huì)被運(yùn)行一遍。因此,當(dāng)我們把export PATH="~/.aspera/connect/bin/:$PATH"這一行命令寫(xiě)入.bashrc后,以后每次登陸服務(wù)器,系統(tǒng)就會(huì)幫我們把這一行命令執(zhí)行一次,我們就不能再自行運(yùn)行了,方法如下:

echo export PATH="~/.aspera/connect/bin/:$PATH" >>.bashrc

這樣我們就把這一行代碼寫(xiě)入到.bashrc里面了,我們說(shuō)過(guò),.bashrc是在登錄服務(wù)器的時(shí)候才會(huì)被執(zhí)行,因此,我們修改好了之后,要重新登錄服務(wù)器,或者重新運(yùn)行一下.bashrc,方法如下:

source .bashrc

這里不建議新手采用vim來(lái)編輯.bashrc,除非你已經(jīng)知道如何使用vim這個(gè)工具

一些其他軟件,如conda,在安裝的時(shí)候會(huì)有一句提示,問(wèn)我們是否要把conda的環(huán)境添加到.bashrc如:

Do you wish the installer to prepend the Miniconda2 install location
to PATH in your /trainee/vip18/.bashrc ? [yes|no]
[no] >>> 

我們直接輸入yes,這樣conda的環(huán)境就自動(dòng)添加到.bashrc里面了,不需要像上面那樣自己添加。

1561605982702.png

補(bǔ)充一個(gè)錯(cuò)誤的示例

有一些初學(xué)者,在修改環(huán)境變量的時(shí)候,不小心改成了這樣:

echo export PATH="~/.aspera/connect/bin/:$ PATH" >>.bashrc

咋一看好像沒(méi)什么問(wèn)題,但其實(shí)這是個(gè)大問(wèn)題,后面的$PATH之間按多了一個(gè)空格,重新激活.bashrc后,就會(huì)出現(xiàn)下面的現(xiàn)象:

image.png

上面的這些命令都用不了了,報(bào)錯(cuò)信息都寫(xiě)著:xxx is not included in the PATH environment variable
但是同時(shí),報(bào)錯(cuò)信息也給出了非常重要的一點(diǎn),如:Command 'ls' is available in '/bin/ls',也就是告訴你了ls命令的可執(zhí)行文件所在的路徑,那么,我們只需要采用全路徑調(diào)用的方法即可使用這些命令了。

image.png

當(dāng)然,我們最終的解決辦法還是要把環(huán)境變量改回來(lái),一個(gè)方法就是刪掉最后一行,也就是我們前面追加的一行代碼,如:

/bin/sed -i '$d' .bashrc

最后在重新登錄服務(wù)器就ok了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容