個(gè)人理解惜傲,環(huán)境變量就是給那些復(fù)雜的語(yǔ)句起一個(gè)簡(jiǎn)單的名字,方便書(shū)寫(xiě)贝攒,管理
命令 | 作用 |
---|---|
printenv 或env
|
查看全局環(huán)境變量 |
set |
查看局部環(huán)境變量 |
= |
自定義局部環(huán)境變量 |
export |
導(dǎo)出自定義局部環(huán)境變量 |
unset |
刪除環(huán)境變量 |
1.環(huán)境變量
存儲(chǔ)shell會(huì)話(huà)和工作環(huán)境的信息盗誊,換句話(huà)說(shuō)就是一些數(shù)據(jù)信息可以存儲(chǔ)在內(nèi)存中,shell或程序能夠訪(fǎng)問(wèn)到他們。環(huán)境變量一般分為全局變量哈踱、局部變量
查看全局環(huán)境變量 printenv
或env
查看
shell中都會(huì)有一些預(yù)先設(shè)定好的環(huán)境變量荒适,可以通過(guò)命令printenv
或env
命令查看
例:
? ~ env
COLORFGBG=7;0
ITERM_PROFILE=Default
XPC_FLAGS=0x0
LANG=zh_CN.UTF-8
SHELL=/bin/zsh
TERM_PROGRAM_VERSION=3.0.15
TERM_PROGRAM=iTerm.app
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
TERM=xterm-256color
XPC_SERVICE_NAME=0
SHLVL=1
上面只展示了一部分,涉及到個(gè)人信息开镣,刪除了一分部
*注意 printenv
和env
的區(qū)別是printenv
可以展示單個(gè)變量信息env
不可以
例:
? ~ printenv PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
? ~ env PATH
env: PATH: No such file or directory
*注意 命令echo
也可以顯示單個(gè)變量信息刀诬,不過(guò)要在變量前加$
例:
? ~ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
*注意 變量名前加$
,能夠讓變量直接當(dāng)命令行參數(shù)使用邪财,可以試一下命令ls $HOME
看看效果
*注意 printenv
和env
命令列出的都是全局變量陕壹,這些變量都可以用在子shell中
查看局部環(huán)境變量
系統(tǒng)沒(méi)有提供查看局部變量的命令,但是可以通過(guò)set
命令查看某個(gè)進(jìn)程的所有環(huán)境變量(包括局部和全局)
*注意 set
命令不會(huì)列出所有的環(huán)境變量卧蜓,并且有些環(huán)境變量是沒(méi)有值的
2.用戶(hù)自定義環(huán)境變量
自定義局部環(huán)境變量 =
例:
? ~ my_variable=hello
? ~ echo $my_variable
hello
*注意 利用=
可直接設(shè)置一個(gè)局部環(huán)境變量
*注意 =
左右都是沒(méi)有空格的帐要,否則設(shè)置將不會(huì)成功
*注意 當(dāng)給帶空格的字符串設(shè)置環(huán)境變量的時(shí)候用引號(hào),例如:my_variable="hello world"
*注意 一般我們自定義的環(huán)境變量都用小寫(xiě)字母弥奸,系統(tǒng)自定義的環(huán)境變量是大寫(xiě)榨惠,這樣更容易區(qū)分管理
*注意 上面的命令創(chuàng)建的是局部環(huán)境變量,在子shell中不可用
*注意 子shell中創(chuàng)建的局部環(huán)境變量盛霎,當(dāng)退出子shell的時(shí)候赠橙,父shell也是不可用的
自定義全局環(huán)境變量 在局部變量的基礎(chǔ)上導(dǎo)出export
例:
? ~ my_variable=hello
? ~ export my_variable
? ~ printenv my_variable
hello
導(dǎo)出的變量就變成了全局變量,在子shell中也可以使用該變量
*注意 在子shell中修改全局變量愤炸,不會(huì)對(duì)父shell產(chǎn)生影響期揪,即使用了export
導(dǎo)出命令
刪除環(huán)境變量 unset
例:
? ~ unset my_variable
*注意 在子shell刪除全局變量不會(huì)影響到父shell
3.設(shè)置PATH環(huán)境變量
PATH環(huán)境變量相信大家都聽(tīng)說(shuō)過(guò),他定義了用于進(jìn)行命令或程序查找的目錄规个,各個(gè)目錄間用分號(hào)分隔凤薛,這里說(shuō)一下如何配置
從新定義很簡(jiǎn)單,只需引用原來(lái)的PATH值诞仓,然后添加新目錄到后面就行了
例:
PATH=$PATH:/aaa/bbb
這樣就修改了PATH環(huán)境變量
*注意 如果希望子shell也能用缤苫,要用export
將PATH導(dǎo)出
*注意 拼接當(dāng)前目錄到PATH,例如:PATH=$PATH:.
*注意 對(duì)PATH的修改墅拭,只能持續(xù)到退出或重啟系統(tǒng)活玲,下面介紹如何永久保持環(huán)境變量的修改效果
首先分別做兩個(gè)操作
ls -a /etc/
輸入上面的命令,回車(chē)谍婉,會(huì)發(fā)現(xiàn)列出了好多文件舒憾,這些都是系統(tǒng)文件
再做操作
ls -a $HOME
輸入上面的命令,回車(chē)穗熬,會(huì)發(fā)現(xiàn)列出了好多文件镀迂,這些都是當(dāng)前登錄用戶(hù)的個(gè)人文件
一般登錄shell的時(shí)候會(huì)從幾個(gè)默認(rèn)的文件啟動(dòng),這些文件叫做啟動(dòng)文件或環(huán)境文件唤蔗,bash會(huì)根據(jù)你啟動(dòng)的不同方式招拙,讀取不同的啟動(dòng)文件唧瘾,bash shell的啟動(dòng)方式有三種
1.登錄時(shí)作為默認(rèn)登錄shell
2.作為非登錄shell的交互式shell
3.作為運(yùn)行腳本的非交互shell
一般啟動(dòng)的時(shí)候會(huì)先讀取系統(tǒng)文件的/etc/profile
文件,這個(gè)是系統(tǒng)的主啟動(dòng)文件别凤,哪個(gè)shell啟動(dòng)都會(huì)讀取該文件
再根據(jù)不同的需求讀取個(gè)人文件的$HOME/.bash_profile
、$HOME/.bashrc
领虹、$HOME/.bash_login
或$HOME/.profile
(其實(shí)不同的系統(tǒng)文件的差異是非常大的规哪,但是一般的都是讀取這四個(gè)文件)
上面說(shuō)的啟動(dòng)過(guò)程是登錄時(shí)作為默認(rèn)登錄shell啟動(dòng)(打開(kāi)控制臺(tái)就是這種啟動(dòng)方式)
下面說(shuō)一下作為非登錄shell的交互式shell
當(dāng)在控制臺(tái)輸入bash
,啟動(dòng)一個(gè)子shell的時(shí)候塌衰,就是作為非登錄shell的交互式shell诉稍,這時(shí)不會(huì)讀取/etc/profile
系統(tǒng)文件,而是直接讀取個(gè)人文件$HOME/.bash_profile
最疆、$HOME/.bashrc
杯巨、$HOME/.bash_login
或$HOME/.profile
最后介紹一下作為運(yùn)行腳本的非交互shell
系統(tǒng)執(zhí)行shell腳本用的就是非交互式shell,因?yàn)闆](méi)有和我們直接交互的地方(命令行輸入等)努酸,所以叫非交互shell
一般情況下服爷,bash shell會(huì)提供一個(gè)BASH_ENV環(huán)境變量,通過(guò)這個(gè)變量來(lái)查看執(zhí)行啟動(dòng)的文件获诈,如果有指定的文件仍源,shell會(huì)執(zhí)行該文件里的命令,這些命令通常包括shell腳本變量設(shè)置
如果沒(méi)有設(shè)置BASH_ENV環(huán)境變量舔涎,shell腳本會(huì)通過(guò)啟動(dòng)一個(gè)子shell來(lái)執(zhí)行笼踩,子shell會(huì)集成父shell的變量環(huán)境,父shell一般就是登錄shell亡嫌,登錄的時(shí)候會(huì)啟用上面介紹過(guò)的登錄時(shí)作為默認(rèn)登錄shell中涉及的文件
通過(guò)上面三種登錄方式的介紹嚎于,應(yīng)該理解了shell進(jìn)程以及對(duì)應(yīng)的環(huán)境文件,找出這些文件挟冠,做修改就可以永久性的修改環(huán)境變量了
*注意 一般我們做修改的都是個(gè)人文件下($HOME目錄下)的環(huán)境變量修改于购,這樣不影響系統(tǒng)文件,即使系統(tǒng)更新也不會(huì)影響個(gè)人的配置
*注意 我們平時(shí)用的GUI客戶(hù)端的環(huán)境變量可能需要再另外一些配置文件中設(shè)置圃郊,和bash shell環(huán)境變量不在一個(gè)地方
4.數(shù)組變量
環(huán)境變量可以作為數(shù)組使用
例:創(chuàng)建一個(gè)數(shù)組變量
? ~ my_test=(one two three)
? ~ echo $my_test
one two three
可以用數(shù)組下標(biāo)提取單獨(dú)某個(gè)數(shù)組元素
? ~ echo ${my_test[1]}
one
通過(guò)數(shù)組下標(biāo)改變某個(gè)位置的值
? ~ my_test[1]=zero
? ~ echo $my_test
zero two three
*注意 數(shù)組變量的操作還有很多价涝,大家自行查閱
*注意 不同的shell對(duì)數(shù)組變量操作會(huì)有些許的不同,例如下標(biāo)的起始是以0還是以1開(kāi)頭持舆、刪除數(shù)組變量等色瘩,上面對(duì)數(shù)組變量的操作是在zsh下操作的