Linux的變量可分為兩類:環境變量和本地變量
環境變量,或者稱為全局變量,存在與所有的shell中,在你登陸系統的時候就已經有了相應的系統定義的環境變量了。Linux的環境變量具有繼承性,即子shell會繼承父shell的環境變量。
本地變量,當前shell中的變量,很顯然本地變量中肯定包含環境變量。Linux的本地變量的非環境變量不具備繼承性。
Linux中環境變量的文件
當你進入系統的時候,linux就會為你讀入系統的環境變量,這些環境變量存放在什么地方,那就是環境變量的文件中。Linux中有很多記載環境變量的文件,它們被系統讀入是按照一定的順序的。
1. /etc/profile:
此文件為系統的環境變量,它為每個用戶設置環境信息,當用戶第一次登錄時,該文件被執行。并從/etc/profile.d目錄的配置文件中搜集shell的設置。
這個文件,是任何用戶登陸操作系統以后都會讀取的文件(如果用戶的shell是csh、tcsh、zsh,則不會讀取此文件),用于獲取系統的環境變量,只在登陸的時候讀取一次。
假設用戶使用的是BASH,那么
2. /etc/bashrc:
在執行完/etc/profile內容之后,如果用戶的SHELL運行的是bash,那么接著就會執行此文件。另外,當每次一個新的bash shell被打開時,該文件被讀取。
每個使用bash的用戶在登陸以后執行完/etc/profile中內容以后都會執行此文件,在新開一個bash的時候也會執行此文件。因此,如果你想讓每個使用bash的用戶每新開一個bash和每次登陸都執行某些操作,或者給他們定義一些新的環境變量,就可以在這個里面設置。
3. ~/.bash_profile:
每個用戶都可使用該文件輸入專用于自己使用的shell信息。當用戶登錄時,該文件僅僅執行一次,默認情況下,它設置一些環境變量,執行用戶的.bashrc文件。
單個用戶此文件的修改只會影響到他以后的每一次登陸系統。因此,可以在這里設置單個用戶的特殊的環境變量或者特殊的操作,那么它在每次登陸的時候都會去獲取這些新的環境變量或者做某些特殊的操作,但是僅僅在登陸時。
4. ~/.bashrc:
該文件包含專用于單個人的bash shell的bash信息,當登錄時以及每次打開一個新的shell時,該該文件被讀取。
單個用戶此文件的修改會影響到他以后的每一次登陸系統和每一次新開一個bash。因此,可以在這里設置單個用戶的特殊的環境變量或者特殊的操作,那么每次它新登陸系統或者新開一個bash,都會去獲取相應的特殊的環境變量和特殊操作。
~/.bash_logout:
當每次退出系統(退出bash shell)時,執行該文件。
幾個命令
env和printenv
這兩個變量用于打印所有的環境變量:
[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”或者“-”,都是表示忽略繼承的環境變量;這里的name=value,用于指定本地變量對,可以有多組;整個命令的含義是,忽略繼承的環境變量,設定多組name變量,在此基礎上運行命令command。如
env -i test="test" bash -c 'echo $SHELL; env'
/bin/bash
PWD=/home/oracle
test=test
SHLVL=1
_=/bin/env
很顯然,這里新運行bash并沒有繼承環境變量,但是卻設置了本地變量test。
set
用于顯示與設置當前本地變量。單獨一個set就顯示了當前環境的所有的變量,它肯定包括環境變量和一些非環境變量,如:
[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很有很多其他的選項,具體請參考man set。
unset
用于清除變量。不管這個變量是環境變量還是本地變量,它都可以清除。
-- 下面是清除本地變量
[oracle@devdb1 oracle]$ set|grep myname
myname=ilonng
[oracle@devdb1 oracle]$ unset myname
[oracle@devdb1 oracle]$ set|grep myname
-- 下面是清除環境變量
[oracle@devdb1 oracle]$ env|grep myname
myname=ilonng
[oracle@devdb1 oracle]$ unset myname
[oracle@devdb1 oracle]$ env|grep myname
export
用于把變量變成當前shell和其子shell的環境變量,存活期是當前的shell及其子shell,因此重新登陸以后,它所設定的環境變量就消失了。如何將環境變量永久化?修改上面介紹的那幾個環境變量的配置文件。
[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
當直接執行一個腳本的時候,其實是在一個子shell環境運行的,即開啟了一個子shell來執行這個腳本,腳本執行完后該子shell自動退出。
有沒有辦法在當前shell中執行一個腳本呢?使用source命令就可以讓腳本在當前shell中執行。如:
[oracle@dbamonitor NBU]$ cat test.sh -- 查看腳本內容,顯示變量內容
echo $myname
[oracle@dbamonitor NBU]$ echo $myname -- 變量存在,內容是ilonng
ilonng
[oracle@dbamonitor NBU]$ set |grep myname -- 變量是本地變量
myname=ilonng
[oracle@dbamonitor NBU]$ env |grep myname -- 變量不是環境變量
[oracle@dbamonitor NBU]$ sh test.sh -- 直接執行,新開子shell,非環境變量的本地變量不具備繼承性,在子shell中不可見
-- 這里什么都沒有輸出
[oracle@dbamonitor NBU]$ source test.sh -- source命令,是腳本在當前shell中執行
ilonng