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

Linux 的變量可分爲兩類:環境變量和本地變量

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

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

幾個命令

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

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

3.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

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 自動退出。
[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 中不可見
-- 這裏什麼都沒有輸出

有沒有辦法在當前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 登錄退出時被讀取

發佈了21 篇原創文章 · 獲贊 5 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章