Linux的變量可分為兩類(lèi):環(huán)境變量和本地變量
環(huán)境變量,或者稱(chēng)為全局變量,存在與所有的shell中,在你登陸系統(tǒng)的時(shí)候就已經(jīng)有了相應(yīng)的系統(tǒng)定義的環(huán)境變量了。Linux的環(huán)境變量具有繼承性,即子shell會(huì)繼承父shell的環(huán)境變量。
本地變量,當(dāng)前shell中的變量,很顯然本地變量中肯定包含環(huán)境變量。Linux的本地變量的非環(huán)境變量不具備繼承性。
Linux中環(huán)境變量的文件
當(dāng)你進(jìn)入系統(tǒng)的時(shí)候,linux就會(huì)為你讀入系統(tǒng)的環(huán)境變量,這些環(huán)境變量存放在什么地方,那就是環(huán)境變量的文件中。Linux中有很多記載環(huán)境變量的文件,它們被系統(tǒng)讀入是按照一定的順序的。
1. /etc/profile:
此文件為系統(tǒng)的環(huán)境變量,它為每個(gè)用戶(hù)設(shè)置環(huán)境信息,當(dāng)用戶(hù)第一次登錄時(shí),該文件被執(zhí)行。并從/etc/profile.d目錄的配置文件中搜集shell的設(shè)置。
這個(gè)文件,是任何用戶(hù)登陸操作系統(tǒng)以后都會(huì)讀取的文件(如果用戶(hù)的shell是csh、tcsh、zsh,則不會(huì)讀取此文件),用于獲取系統(tǒng)的環(huán)境變量,只在登陸的時(shí)候讀取一次。
假設(shè)用戶(hù)使用的是BASH,那么
2. /etc/bashrc:
在執(zhí)行完/etc/profile內(nèi)容之后,如果用戶(hù)的SHELL運(yùn)行的是bash,那么接著就會(huì)執(zhí)行此文件。另外,當(dāng)每次一個(gè)新的bash shell被打開(kāi)時(shí),該文件被讀取。
每個(gè)使用bash的用戶(hù)在登陸以后執(zhí)行完/etc/profile中內(nèi)容以后都會(huì)執(zhí)行此文件,在新開(kāi)一個(gè)bash的時(shí)候也會(huì)執(zhí)行此文件。因此,如果你想讓每個(gè)使用bash的用戶(hù)每新開(kāi)一個(gè)bash和每次登陸都執(zhí)行某些操作,或者給他們定義一些新的環(huán)境變量,就可以在這個(gè)里面設(shè)置。
3. ~/.bash_profile:
每個(gè)用戶(hù)都可使用該文件輸入專(zhuān)用于自己使用的shell信息。當(dāng)用戶(hù)登錄時(shí),該文件僅僅執(zhí)行一次,默認(rèn)情況下,它設(shè)置一些環(huán)境變量,執(zhí)行用戶(hù)的.bashrc文件。
單個(gè)用戶(hù)此文件的修改只會(huì)影響到他以后的每一次登陸系統(tǒng)。因此,可以在這里設(shè)置單個(gè)用戶(hù)的特殊的環(huán)境變量或者特殊的操作,那么它在每次登陸的時(shí)候都會(huì)去獲取這些新的環(huán)境變量或者做某些特殊的操作,但是僅僅在登陸時(shí)。
4. ~/.bashrc:
該文件包含專(zhuān)用于單個(gè)人的bash shell的bash信息,當(dāng)?shù)卿洉r(shí)以及每次打開(kāi)一個(gè)新的shell時(shí),該該文件被讀取。
單個(gè)用戶(hù)此文件的修改會(huì)影響到他以后的每一次登陸系統(tǒng)和每一次新開(kāi)一個(gè)bash。因此,可以在這里設(shè)置單個(gè)用戶(hù)的特殊的環(huán)境變量或者特殊的操作,那么每次它新登陸系統(tǒng)或者新開(kāi)一個(gè)bash,都會(huì)去獲取相應(yīng)的特殊的環(huán)境變量和特殊操作。
~/.bash_logout:
當(dāng)每次退出系統(tǒng)(退出bash shell)時(shí),執(zhí)行該文件。
幾個(gè)命令
env和printenv
這兩個(gè)變量用于打印所有的環(huán)境變量:
[root@devdb1 worksh]# env
HOSTNAME=devdb1
TERM=vt100
..........................................................
OLDPWD=/root
[root@devdb1 worksh]# printenv
HOSTNAME=devdb1
TERM=vt100
..........................................................
OLDPWD=/root
[root@devdb1 worksh]#
另外,env變量還有其他的功能,如下:
env [-i|-] [name=value] [command [argument]]
這里的“-i”或者“-”,都是表示忽略繼承的環(huán)境變量;這里的name=value,用于指定本地變量對(duì),可以有多組;整個(gè)命令的含義是,忽略繼承的環(huán)境變量,設(shè)定多組name變量,在此基礎(chǔ)上運(yùn)行命令command。如
env -i test="test" bash -c 'echo $SHELL; env'
/bin/bash
PWD=/home/oracle
test=test
SHLVL=1
_=/bin/env
很顯然,這里新運(yùn)行bash并沒(méi)有繼承環(huán)境變量,但是卻設(shè)置了本地變量test。
set
用于顯示與設(shè)置當(dāng)前本地變量。單獨(dú)一個(gè)set就顯示了當(dāng)前環(huán)境的所有的變量,它肯定包括環(huán)境變量和一些非環(huán)境變量,如:
[oracle@devdb1 oracle]$ set
BASH=/bin/bash
BASH_VERSINFO=([0]="2" [1]="05b" [2]="0" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu")
BASH_VERSION='2.05b.0(1)-release'
BDUMP=/opt/oracle/admin/devdb/bdump
COLORS=/etc/DIR_COLORS
COLUMNS=132
DIRSTACK=()
EUID=500
GROUPS=()
G_BROKEN_FILENAMES=1
HISTFILE=/home/oracle/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/home/oracle
.............................
set很有很多其他的選項(xiàng),具體請(qǐng)參考man set。
unset
用于清除變量。不管這個(gè)變量是環(huán)境變量還是本地變量,它都可以清除。
-- 下面是清除本地變量
[oracle@devdb1 oracle]$ set|grep myname
myname=ilonng
[oracle@devdb1 oracle]$ unset myname
[oracle@devdb1 oracle]$ set|grep myname
-- 下面是清除環(huán)境變量
[oracle@devdb1 oracle]$ env|grep myname
myname=ilonng
[oracle@devdb1 oracle]$ unset myname
[oracle@devdb1 oracle]$ env|grep myname
export
用于把變量變成當(dāng)前shell和其子shell的環(huán)境變量,存活期是當(dāng)前的shell及其子shell,因此重新登陸以后,它所設(shè)定的環(huán)境變量就消失了。如何將環(huán)境變量永久化?修改上面介紹的那幾個(gè)環(huán)境變量的配置文件。
[oracle@devdb1 oracle]$ export myname=ilonng
[oracle@devdb1 oracle]$ env|grep myname
myname=ilonng
[oracle@devdb1 oracle]$ bash
[oracle@devdb1 oracle]$ env|grep myname
myname=ilonng
[oracle@devdb1 oracle]$ exit
exit
[oracle@devdb1 oracle]$ env|grep myname
myname=ilonng
source
當(dāng)直接執(zhí)行一個(gè)腳本的時(shí)候,其實(shí)是在一個(gè)子shell環(huán)境運(yùn)行的,即開(kāi)啟了一個(gè)子shell來(lái)執(zhí)行這個(gè)腳本,腳本執(zhí)行完后該子shell自動(dòng)退出。
有沒(méi)有辦法在當(dāng)前shell中執(zhí)行一個(gè)腳本呢?使用source命令就可以讓腳本在當(dāng)前shell中執(zhí)行。如:
[oracle@dbamonitor NBU]$ cat test.sh -- 查看腳本內(nèi)容,顯示變量?jī)?nèi)容
echo $myname
[oracle@dbamonitor NBU]$ echo $myname -- 變量存在,內(nèi)容是ilonng
ilonng
[oracle@dbamonitor NBU]$ set |grep myname -- 變量是本地變量
myname=ilonng
[oracle@dbamonitor NBU]$ env |grep myname -- 變量不是環(huán)境變量
[oracle@dbamonitor NBU]$ sh test.sh -- 直接執(zhí)行,新開(kāi)子shell,非環(huán)境變量的本地變量不具備繼承性,在子shell中不可見(jiàn)
-- 這里什么都沒(méi)有輸出
[oracle@dbamonitor NBU]$ source test.sh -- source命令,是腳本在當(dāng)前shell中執(zhí)行
ilonng