標籤:style blog os ar 使用 strong sp 檔案 div
環境變數,或者稱為全域變數,存在與所有的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
這兩個變數用於列印所有的環境 變數:
set
用於顯示與設定當前本地 變數。單獨一個set 就顯示了當前環境的所有的變數,它肯定包括環境變數和一些非環境變數
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
export
用於把變數變成當前shell 和其子shell 的環境變數,存活期是當前的shell 及其子shell ,因此重新登陸以後,它所設定的環境變數就消失了。如何將環境變數永久化?修改上面介紹的那幾個環境變數的設定檔
source
當直接執行一個指令碼的時候,其實是在一個子shell 環境啟動並執行,即開啟了一個子shell 來執行這個指令碼,指令碼執行完後該子shell 自動結束。
有沒有辦法在當前shell 中執行一個指令碼呢?使用source 命令就可以讓指令碼在當前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變數分為本地變數和環境變數。
1、本地變數 -- 在使用者現有啟動並執行指令碼中使用
1) 定義本地變數 格式: variable-name=value
例子:[[email protected] /root]# LOCALTEST="test"
[[email protected] /root]# echo $LOCALTEST test
2) 顯示本地變數 格式: set
例子:[[email protected] root]# set
3) 清除本地變數 格式:unset variable-name
例如:[[email protected] /root]# unset LOCALTEST
此時再執行echo $LOCALTEST將看不到變數LOCALTEST的輸出。
2、環境變數 -- 在所有的子進程中使用
1) 定義環境變數 格式: export variable-name=value (與本地變數的定義相比,多了一個export關鍵字)
例子:[[email protected] /root]# export DOMAIN="chinaitlab.com"
[[email protected] chinaitlab shell]# vi testenv.sh
#!/bin/bash
echo $DOMAIN
[[email protected] shell]# chmod +x testenv.sh
[[email protected]naitlab shell]# ./testenv.sh
chinaitlab.com
2) 顯示環境變數 格式: env (本地變數的顯示使用set,環境變數的顯示使用env)
例子: [[email protected] test]# env
3) 清除環境變數 格式:unset variable-name (用法與本地變數相同,都使用unset)
例子: [[email protected] 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 登入退出時被讀取
linux環境變數 【轉】