Linux是一個多使用者的作業系統。每個使用者登入系統後,都會有一個專用的運行環境。通常每個使用者預設的環境都是相同的,這個預設環境實際上就是一組環境變數的定義。使用者可以對自己的運行環境進行定製,其方法就是修改相應的系統內容變數。
常見的環境變數
對於PATH和HOME等環境變數大家都不陌生。
PATH能夠指定命令的搜尋路徑,那麼動態連結程式庫的路徑用什麼變數指定呢?或者就是在PATH裡面?
比如有一個程式需要/usr/local/lib下面的一個庫檔案,應該怎麼指定其路徑呢?
經常看到有些變數如LD_LIBRARY_PATH,LIBPATH,CLASSPATH等,他們之間有什麼不同和關係?
除此之外,還有下面一些常見環境變數。
◆ HISTSIZE是指儲存曆史命令記錄的條數。
◆ LOGNAME是指目前使用者的登入名稱。
◆ HOSTNAME是指主機的名稱,許多應用程式如果要用到主機名稱的話,通常是從這個環境變數中來取得的。
◆ SHELL是指目前使用者用的是哪種Shell。
◆ LANG/LANGUGE是和語言相關的環境變數,使用多種語言的使用者可以修改此環境變數。
◆ MAIL是指目前使用者的郵件存放目錄。
◆ PS1是基本提示符,對於root使用者是#,對於普通使用者是$。PS2是附屬提示符,預設是“>”。可以通過修改此環境變數來修改當前的命令符,比如下列命令會將提示符修改成字串“Hello,My NewPrompt ”。
# PS1=" Hello,My NewPrompt "
Hello,My NewPrompt
除了這些常見的環境變數,許多應用程式在安裝時也會增加一些環境變數,比如使用Java就要設定JAVA_HOME和CLASSPATH等,而安裝五筆IME會增加環境變數"XMODIFIERS=@im=fcitx"等。
定製環境變數
環境變數是和Shell緊密相關的,使用者登入系統後就啟動了一個Shell。對於Linux來說一般是bash,但也可以重新設定或切換到其它的 Shell。環境變數是通過Shell命令來設定的,設定好的環境變數又可以被所有目前使用者所啟動並執行程式所使用。對於bash這個Shell程式來說,可以通過變數名來訪問相應的環境變數,通過export來設定環境變數。下面通過幾個執行個體來說明。
1. 顯示環境變數HOME
$ echo $HOME
/home/terry
2. 設定一個新的環境變數WELCOME
$ export WELCOME="Hello!"
$ echo $WELCOME
Hello!
3. 使用env命令顯示所有的環境變數
$ env
HOSTNAME=terry.mykms.org
PVM_RSH=/usr/bin/rsh
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
...
4. 使用set命令顯示所有本地定義的Shell變數
$ 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'
COLORS=/etc/DIR_COLORS.xterm
COLUMNS=80
DIRSTACK=()
DISPLAY=:0.0
...
5. 使用unset命令來清除環境變數
set可以設定某個環境變數的值。清除環境變數的值用unset命令。如果未指定值,則該變數值將被設為NULL。樣本如下:
$ export TEST="Test..." #增加一個環境變數TEST
$ env|grep TEST #此命令有輸入,證明環境變數TEST已經存在了
TEST=Test...
$ unset $TEST #刪除環境變數TEST
$ env|grep TEST #此命令沒有輸出,證明環境變數TEST已經存在了
6. 使用readonly命令設定唯讀變數
如果使用了readonly命令的話,變數就不可以被修改或清除了。樣本如下:
$ export TEST="Test..." #增加一個環境變數TEST
$ readonly TEST #將環境變數TEST設為唯讀
$ unset TEST #會發現此變數不能被刪除
-bash: unset: TEST: cannot unset: readonly variable
$ TEST="New" #會發現此也變數不能被修改
-bash: TEST: readonly variable
7. 用C程式來訪問和設定環境變數
對於C程式的使用者來說,可以使用下列三個函數來設定或訪問一個環境變數。
◆ getenv()訪問一個環境變數。輸入參數是需要訪問的變數名字,傳回值是一個字串。如果所訪問的環境變數不存在,則會返回NULL。
◆ setenv()在程式裡面設定某個環境變數的函數。
◆ unsetenv()清除某個特定的環境變數的函數。
另外,還有一個指標變數environ,它指向的是包含所有的環境變數的一個列表。下面的程式可以列印出當前運行環境裡面的所有環境變數:
#include <stdio.h>
extern char**environ;
int main ()
{
char**var;
for (var =environ;*var !=NULL;++var)
printf ("%s /n ",*var);
return 0;
}
還可以通過修改一些相關的環境定義檔案來修改環境變數,比如對於Red Hat等Linux發行版本,與環境相關的檔案有/etc/profile和~/.bashrc等。修改完畢後重新登入一次就生效了。
linux是一個多使用者的作業系統。每個使用者登入系統後,都會有一個專用的運行環境。通常每個使用者預設的環境都是相同的,這個預設環境實際上就是一組環境變數的定義。使用者可以對自己的運行環境進行定製,其方法就是修改相應的系統內容變數。
什麼是環境變數
環境變數是一個具有特定名字的對象,它包含了一個或者多個應用程式所將使用到的資訊。許多使用者(特別是那些剛接觸Linux的新手)發現這些變數有些怪異或者難以控制。其實,這是個誤會:通過使用環境變數,你可以很容易的修改一個牽涉到一個或多個應用程式的配置資訊。
重要的例子
下表羅列了一些Linux系統使用的變數並說明了它們的用處。在表格後面將列舉一些變數例值。
變數 |
說明 |
PATH |
這個變數包含了一系列由冒號分隔開的目錄,系統就從這些目錄裡尋找可執行檔。如果你輸入的可執行檔(例如ls、rc-update或者emerge)不在這些目錄中,系統就無法執行它(除非你輸入這個命令的完整路徑,如/bin/ls)。
|
ROOTPATH |
這個變數的功能和PATH相同,但它只羅列出超級使用者(root)鍵入命令時所需檢查的目錄。
|
LDPATH |
這個變數包含了一系列用冒號隔開的目錄,動態連結器將在這些目錄裡尋找庫檔案。 |
MANPATH |
這個變數包含了一系列用冒號隔開的目錄,命令man會在這些目錄裡搜尋man頁面。
|
INFODIR |
這個變數包含了一系列用冒號隔開的目錄,命令info將在這些目錄裡搜尋info頁面。
|
PAGER |
這個變數包含了瀏覽檔案內容的程式的路徑(例如less或者more)。
|
EDITOR |
這個變數包含了修改檔案內容的程式(檔案編輯器)的路徑(比如nano或者vi)。
|
KDEDIRS |
這個變數包含了一系列用冒號隔開的目錄,裡面放的是KDE相關的資料。 |
CONFIG_PROTECT |
這個變數包含了一系列用空格隔開的目錄,它們在更新的時候會被Portage保護起來。 |
CONFIG_PROTECT_MASK |
這個變數包含了一系列用空格隔開的目錄,它們在更新的時候不會被Portage保護起來。 |
下面你可以找到所有這些變數定義的範例:
代碼 1: 定義範例 |
PATH="/bin:/usr/bin:/usr/local/bin:/opt/bin:/usr/games/bin"ROOTPATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"LDPATH="/lib:/usr/lib:/usr/local/lib:/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3"MANPATH="/usr/share/man:/usr/local/share/man"INFODIR="/usr/share/info:/usr/local/share/info"PAGER="/usr/bin/less"EDITOR="/usr/bin/vim"KDEDIRS="/usr"CONFIG_PROTECT="/usr/X11R6/lib/X11/xkb /opt/tomcat/conf / /usr/kde/3.1/share/config /usr/share/texmf/tex/generic/config/ / /usr/share/texmf/tex/platex/config/ /usr/share/config"CONFIG_PROTECT_MASK="/etc/gconf" |
對於bash shell
關於環境變數命令介紹:
1.echo 顯示某個環境變數值 echo $PATH
2.export 設定一個新的環境變數 export HELLO="hello" (可以無引號)
3.env 顯示所有環境變數
4.set 顯示本地定義的shell變數
5.unset 清除環境變數 unset HELLO
6.readonly 設定唯讀環境變數 readonly HELLO
常見的環境變數
PATH:決定了shell將到哪些目錄中尋找命令或程式
HOME:目前使用者主目錄
MAIL:是指目前使用者的郵件存放目錄。
SHELL:是指目前使用者用的是哪種Shell。
HISTSIZE:是指儲存曆史命令記錄的條數
LOGNAME:是指目前使用者的登入名稱。
HOSTNAME:是指主機的名稱,許多應用程式如果要用到主機名稱的話,通常是從這個環境 變數中來取得的。
LANG/LANGUGE:是和語言相關的環境變數,使用多種語言的使用者可以修改此環境變數。
PS1:是基本提示符,對於root使用者是#,對於普通使用者是$。
PS2:是附屬提示符,預設是“>”。可以通過修改此環境變數來修改當前的命令符,比 如下列命令會將提示符修改成字串“Hello,My NewPrompt ”。
# PS1=" Hello,My NewPrompt "
使用修改.bashrc檔案進行環境變數的編輯,只對目前使用者有用。
使用修改 /etc/profile 檔案進行環境變數的編輯,是對所有使用者有用。大家一定要注意區別。
如何設定Shell環境變數?
Shell |
設定 |
添加 |
去除 |
顯示當前值 |
註解 |
sh |
NAME=value1 export NAME |
NAME=value2:$NAME |
unset NAME |
set(internal)或者env(exported) |
如果需要子進程也看到該環境變數,需要使用export |
ksh |
NAME=value1 export NAME |
NAME=value2:$NAME |
unset NAME |
set(internal)或者env(exported) |
如果需要子進程也看到該環境變數,需要使用export |
csh |
setenv NAME value1 |
setenv NAME value2:$NAME |
unsetenv NAME |
set |
不需要使用export |
bash |
NAME=value1 |
NAME=value2:$NAME |
unset NAME |
set或者env |
如果需要子進程也看到該環境變數,需要使用export |