轉自:http://www.cnblogs.com/growup/archive/2011/07/02/2096142.htmlhtml
Linux 的變量可分爲兩類:環境變量和本地變量linux
環境變量,或者稱爲全局變量,存在與全部的shell 中,在你登錄系統的時候就已經有了相應的系統定義的環境變量了。Linux 的環境變量具備繼承性,即子shell 會繼承父shell 的環境變量。shell
本地變量,當前shell 中的變量,很顯然本地變量中確定包含環境變量。Linux 的本地變量的非環境變量不具有繼承性。bash
Linux 中環境變量的文件oracle
當你進入系統的時候,linux 就會爲你讀入系統的環境變量,這些環境變量存放在什麼地方,那就是環境變量的文件中。Linux 中有不少記載環境變量的文件,它們被系統讀入是按照必定的順序的。spa
1. /etc/profile :操作系統
此文件爲系統的環境變量,它爲每一個用戶設置環境信息,當用戶第一次登陸時,該文件被執行。並從/etc/profile.d 目錄的配置文件中搜集shell 的設置。htm
這個文件,是任何用戶登錄操做系統之後都會讀取的文件(若是用戶的shell 是csh 、tcsh 、zsh ,則不會讀取此文件),用於獲取系統的環境變量,只在登錄的時候讀取一次。blog
假設用戶使用的是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
這兩個變量用於打印全部的環境 變量:
set
用於顯示與設置當前本地 變量。單獨一個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 ,所以從新登錄之後,它所設定的環境變量就消失了。如何將環境變量永久化?修改上面介紹的那幾個環境變量的配置文件
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 中不可見
-- 這裏什麼都沒有輸出
1、Shell變量分爲本地變量和環境變量。
一、本地變量 -- 在用戶現有運行的腳本中使用
1) 定義本地變量 格式: variable-name=value
例子:[root@jike1 /root]# LOCALTEST="test"
[root@jike1 /root]# echo $LOCALTEST test
2) 顯示本地變量 格式: set
例子:[root@chinaitlab root]# set
3) 清除本地變量 格式:unset variable-name
例如:[root@jike1 /root]# unset LOCALTEST
此時再執行echo $LOCALTEST將看不到變量LOCALTEST的輸出。
二、環境變量 -- 在全部的子進程中使用
1) 定義環境變量 格式: export variable-name=value (與本地變量的定義相比,多了一個export關鍵字)
例子:[root@chinaitlab /root]# export DOMAIN="chinaitlab.com"
[root@ chinaitlab shell]# vi testenv.sh
#!/bin/bash
echo $DOMAIN
[root@chinaitlab shell]# chmod +x testenv.sh
[root@chinaitlab shell]# ./testenv.sh
chinaitlab.com
2) 顯示環境變量 格式: env (本地變量的顯示使用set,環境變量的顯示使用env)
例子: [root@chinaitlab test]# env
3) 清除環境變量 格式:unset variable-name (用法與本地變量相同,都使用unset)
例子: [root@chinaitlab shell]# unset DOMAIN
此時再執行./testenv.sh將看不到變量DOMAIN的輸出。
---------------------------------------------------------------------------------------------------------------------
用戶登陸後加載profile和bashrc的流程以下:
1)/etc/profile-------->/etc/profile.d/*.sh
2)$HOME/.bash_profile-------->$HOME/.bashrc---------->/etc/bashrc
說明:
bash首先執行/etc/profile腳本,/etc/profile腳本先依次執行/etc/profile.d/*.sh
隨後bash會執行用戶主目錄下的.bash_profile腳本,.bash_profile腳本會執行用戶主目錄下的.bashrc腳本,
而.bashrc腳本會執行/etc/bashrc腳本
至此,全部的環境變量和初始化設定都已經加載完成.
bash隨後調用terminfo和inputrc,完成終端屬性和鍵盤映射的設定.
其中PATH這個變量特殊說明一下:
若是是超級用戶登陸,在沒有執行/etc/profile以前,PATH已經設定了下面的路徑:
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
若是是普通用戶,PATH在/etc/profile執行以前設定了如下的路徑:
/usr/local/bin:/bin:/usr/bin
這裏要注意的是:在用戶切換並加載變量,例如su -,這時,若是用戶本身切換本身,好比root用戶再用su - root切換的話,加載的PATH和上面的不同.
準確的說,是不老是同樣.因此,在/etc/profile腳本中,作了以下的配置:
if [ `id -u` = 0 ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
fi
若是是超級用戶登陸,在/etc/profile.d/krb5.sh腳本中,在PATH變量搜索路徑的最前面增長/usr/kerberos/sbin:/usr/kerberos/bin
若是是普通用戶登陸,在/etc/profile.d/krb5.sh腳本中,在PATH變量搜索路徑的最前面增長/usr/kerberos/bin
在/etc/profile腳本中,會在PATH變量的最後增長/usr/X11R6/bin目錄
在$HOME/.bash_profile中,會在PATH變量的最後增長$HOME/bin目錄
以root用戶爲例,最終的PATH會是這樣(沒有其它自定義的基礎上)
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin
以alice用戶(普通用戶)爲例
/usr/kerberos/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/alice/bin
----------------------------------------------------------------------------------------------------------------------------------
~/.bash_profile 用戶登陸時被讀取,其中包含的命令被執行
~/.bashrc 啓動新的shell時被讀取,並執行
~/.bash_logout shell 登陸退出時被讀取