kooyee ‘s blog

          開源軟件, 眾人努力的結晶, 全人類的共同財富
          posts - 103, comments - 55, trackbacks - 0, articles - 66
             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Linux的shell變量

          Posted on 2008-01-25 18:55 kooyee 閱讀(596) 評論(0)  編輯  收藏 所屬分類: Lniux/Unix

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

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

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

          Linux中環境變量的文件

              當你進入系統的時候,linux就會為你讀入系統的環境變量,這些環境變量存放在什么地方,那就是環境變量的文件中。Linux中有很多記載環境變量的文件,它們被系統讀入是按照一定的順序的。

          1.    /etc/profile

          此文件為系統的環境變量,它為每個用戶設置環境信息,當用戶第一次登錄時,該文件被執行。并從/etc/profile.d目錄的配置文件中搜集shell的設置。

              這個文件,是任何用戶登陸操作系統以后都會讀取的文件(如果用戶的shellcshtcshzsh,則不會讀取此文件),用于獲取系統的環境變量,只在登陸的時候讀取一次。

              假設用戶使用的是BASH,那么



          2.   
          /etc/bashrc

          在執行完/etc/profile內容之后,如果用戶的SHELL運行的是bash,那么接著就會執行此文件。另外,當每次一個新的bash shell被打開時,該文件被讀取。

              每個使用bash的用戶在登陸以后執行完/etc/profile中內容以后都會執行此文件,在新開一個bash的時候也會執行此文件。因此,如果你想讓每個使用bash的用戶每新開一個bash和每次登陸都執行某些操作,或者給他們定義一些新的環境變量,就可以在這個里面設置。



          3.   
          ~/.bash_profile

          每個用戶都可使用該文件輸入專用于自己使用的shell信息。當用戶登錄時,該文件僅僅執行一次,默認情況下,它設置一些環境變量,執行用戶的.bashrc文件。

              單個用戶此文件的修改只會影響到他以后的每一次登陸系統。因此,可以在這里設置單個用戶的特殊的環境變量或者特殊的操作,那么它在每次登陸的時候都會去獲取這些新的環境變量或者做某些特殊的操作,但是僅僅在登陸時。



          4.   
          ~/.bashrc

          該文件包含專用于單個人的bash shellbash信息,當登錄時以及每次打開一個新的shell,該該文件被讀取。

              單個用戶此文件的修改會影響到他以后的每一次登陸系統和每一次新開一個bash。因此,可以在這里設置單個用戶的特殊的環境變量或者特殊的操作,那么每次它新登陸系統或者新開一個bash,都會去獲取相應的特殊的環境變量和特殊操作。

          ~/.bash_logout

          當每次退出系統(退出bash shell),執行該文件。

          幾個命令

              envprintenv

              這兩個變量用于打印所有的環境變量:

          [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

          主站蜘蛛池模板: 塘沽区| 邢台县| 历史| 翁源县| 大埔区| 交城县| 慈溪市| 张家口市| 蛟河市| 麦盖提县| 廉江市| 牡丹江市| 星座| 凤凰县| 广昌县| 土默特左旗| 福建省| 洛扎县| 襄樊市| 维西| 固始县| 马尔康县| 乐亭县| 濮阳县| 东兴市| 久治县| 桦甸市| 福安市| 桓台县| 钟山县| 舞钢市| 新蔡县| 政和县| 靖江市| 新密市| 怀宁县| 赤城县| 乳源| 蒙山县| 界首市| 故城县|