1. 程式人生 > >linux環境變數、本地變數、source、"."、export

linux環境變數、本地變數、source、"."、export

Linux 的變數可分為兩類:環境變數和本地變數

環境變數,或者稱為全域性變數,存在與所有的shell 中,在你登陸系統的時候就已經有了相應的系統定義的環境變量了。Linux 的環境變數具有繼承性,即子shell 會繼承父shell 的環境變數。

本地變數,當前shell 中的變數,顯然本地變數中肯定包含環境變數。Linux 的本地變數不具備繼承性。============================================================================================================================

幾個命令

1.env 和printenv
這兩個變數用於列印所有的環境 變數:

2.set
用於顯示與設定當前本地 變數。單獨一個set 就顯示了當前環境的所有的變數,它肯定包括環境變數和一些非環境變數

3.unset
用於清除變數。不管這個變數是環境變數還是本地變數,它都可以清除。
-- 下面是清除本地變數
[[email protected] oracle]$ set|grep myname
myname=ilonng
[[email protected] oracle]$ unset myname
[[email protected] oracle]$ set|grep myname

-- 下面是清除環境變數
[[email protected] oracle]$ env|grep myname
myname=ilonng
[[email protected] oracle]$ unset myname
[[email protected] oracle]$ env|grep myname

4.export
用於把變數變成當前shell 和其子shell 的環境變數,存活期是當前的shell 及其子shell,因此重新登陸以後,它所設定的環境變數就消失了。如何將環境變數永久化?修改上面介紹的那幾個環境變數的配置檔案
export命令可以用於傳遞一個或多個變數的值到任何後繼指令碼

。 登入到系統後,系統將啟動一個使用者shell。在這個shell中,可以使用shell命令或宣告變數,也可以建立並執行shell指令碼程式。執行shell指令碼程式時,系統將建立一個子shell。此時,系統中將有兩個shell,一個是登入時系統啟動的shell,另一個是系統為執行指令碼程式建立的shell。當一個指令碼程式執行完畢,它的指令碼shell將終止,可以返回到執行該指令碼之前的shell。從這種意義上來說,使用者可以有許多shell,每個shell都是由某個shell(稱為父shell)派生的。在子shell中定義的變數只在該子shell內有效。如果在一個shell指令碼程式中定義了一個變數,當該指令碼程式執行時,這個定義的變數只是該指令碼程式內的一個區域性變數,其他的shell不能引用它,要使某個變數的值可以在其他shell中被改變,可以使用export命令對已定義的變數進行輸出。export命令將使系統在建立每一個新的shell時定義這個變數的一個拷貝。這個過程稱之為變數輸出。
5.source
當直接執行一個指令碼的時候,其實是在一個子shell 環境執行的,即開啟了一個子shell 來執行這個指令碼,指令碼執行完後該子shell 自動退出。
[[email protected] NBU]$ cat test.sh    -- 檢視指令碼內容,顯示變數內容
echo $myname
[[email protected] NBU]$ echo $myname -- 變數存在,內容是ilonng
ilonng
[[email protected] NBU]$ set |grep myname -- 變數是本地變數
myname=ilonng
[[email protected] NBU]$ env |grep myname -- 變數不是環境變數
[[email protected] NBU]$ sh test.sh -- 直接執行,新開子shell ,非環境變數的本地變數不具備繼承性,在子shell 中不可見-- 這裡什麼都沒有輸出

有沒有辦法在當前shell 中執行一個指令碼呢?。使用source 命令就可以讓指令碼在當前shell 中執行,source 命令可以影響執行指令碼的shell的環境,而 export 則只能影響其shell的環境。source a.sh 同直接執行 ./a.sh 有什麼不同呢,比如你在一個腳本里export $KKK=111 ,如果你用./a.sh執行該指令碼,執行完畢後,你執行 echo $KKK ,發現沒有值,如果你用source來執行 ,然後再echo ,就會發現KKK=111因為呼叫./a.sh來執行shell是在一個子shell裡執行的,所以執行後,結果並沒有反應到父shell不過source不同,他就是在本shell中執行的,所以能看到結果。source 命令會強制執行指令碼中的全部命令,而忽略檔案的許可權。

source 命令是 bash shell 的內建命令,從 C Shell 而來
“.”點符號,用法和 source 相同,從Bourne Shell而來

============================================================================================================================

Linux 中環境變數的檔案

當你進入系統的時候,linux 就會為你讀入系統的環境變數,這些環境變數存放在什麼地方,那就是環境變數的檔案中。Linux 中有很多記載環境變數的檔案,它們被系統讀入是按照一定的順序的。
1.    /etc/profile :
此檔案為系統的環境變數,它為每個使用者設定環境資訊,當用戶第一次登入時,該檔案被執行。並從/etc/profile.d 目錄的配置檔案中搜集shell 的設定。 這個檔案,是任何使用者登陸作業系統以後都會讀取的檔案(如果使用者的shell 是csh 、tcsh 、zsh ,則不會讀取此檔案),用於獲取系統的環境變數,只在登陸的時候讀取一次。

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 ,都會去獲取相應的特殊的環境變數和特殊操作。

5.    ~/.bash_logout :
當每次退出系統( 退出bash shell) 時, 執行該檔案。

============================================================================================================================

使用者登入後加載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 登入退出時被讀取