環境變數
我們在第2章討論了環境變數。這些變數可以用來控制shell指令碼和其他程式的形為。我們也可以使用他們來配置使用者環境。例如,每乙個使用者都有乙個環境變數,home,定義了其使用者主目錄,作為其會話的起始位置。正如我們所知的,我們由shell提示來測試環境變數:
$ echo $home
/home/neil
我們也可以使用shell的set命令來列出所有的環境變數。
unix描述定義了許多標準的環境變數用於各種目的,包括終端型別,預設編輯器,時區,等等。乙個c程式可以使用putenv與getenv函式來訪問環境變數。
#include
char *getenv(const char *name);
int putenv(const char *string);
環 境由name=value形式的字串組成。getenv函式會查詢由name所指定的環境,並且返回與其相關的值。如果所請求的變數不存,則會返回 null。如果變數存在但是卻沒有值,getenv函式會成功返回乙個字串,其第乙個位元組為null。由getenv函式所返回的變數儲存在由 getenv所提供的表態儲存區中,他不可被程式覆蓋,因為他會由getenv的序列呼叫覆蓋。
putenv函式的引數為乙個name=value格式的字串,並且將其新增到當前環境中。如果因為缺少可用記憶體不能擴充套件環境時,函式呼叫失敗並且返回-1。如果發生這種情況,錯誤變數errno會被設定為enomem。
下面讓我們來編寫乙個程式列印出我們選擇的任何環境變數的值。如果我們程式指定了第二個引數,我們還可以設定其值。
試驗--getenv與putenv
1 main函式宣告之後的幾行確保程式environ.c被正確的呼叫:
#include
#include
#include
int main(int argc, char *argv)
2 做完這些工作以後,我們使用getenv函式由環境中取得變數的值:
var = argv[1];
value = getenv(var);
if(value)
printf(「variable %s has value %s/n」, var, value);
else
printf(「variable %s has no value/n」, var);
3 接下來我們要檢測程式呼叫是否指定了第二個引數。如果指定了第二個引數,我們將變數設定為通過組合成的name=value格式的引數值,然後呼叫putenv:
if(argc == 3)
strcpy(string,var);
strcat(string,」=」);
strcat(string,value);
printf(「calling putenv with: %s/n」,string);
if(putenv(string) != 0)
4 最後,我們通過再次呼叫getenv函式來測試新的變數值:
value = getenv(var);
if(value)
printf(「new value of %s is %s/n」, var, value);
else
printf(「new value of %s is null??/n」, var);
}exit(0);
}如果我們執行這個程式,我們可以得到下面的程式輸出:
$ ./environ home
variable home has value /home/neil
$ ./environ fred
variable fred has no value
$ ./environ fred hello
variable fred has no value
calling putenv with: fred=hello
new value of fred is hello
$ ./environ fred
variable fred has no value
注意,環境只對我們的程式區域性可見。我們在程式內部所做的改變並不會反映到程式外部,因為變數值並不會由子程序(我們的程式)傳遞到父程序(shell)。
使用環境變數
程式通常使用環境變數來改變其工作的方式。使用者可以用各種方式改變環境變數,或者是在其預設環境中,修改我們的登陸shell所讀取的.profile檔案,或者是使用乙個shell特定的啟動檔案(rc),或者是在shell命令列指定變數。例如:
$ ./environ fred
variable fred has no value
$ fred=hello ./environ fred
variable fred has value hello
shell將初始的變數賦值作為環境變數的臨時改變。在我們上面的第二個例子中,程式environ執行在乙個變數fred有值的環境中。
例如,在我們的cd資料庫程式的將來版本中,我們會改變乙個環境變數cddb,來指定要使用的資料庫。每個使用者都可以指定他們自己的預設值或是使用乙個shell命令來進行設定:
$ cddb=mycds; export cddb
或者environ變數
正如我們所看到的,程式環境是由name=value格式的字串組成的。這個字串陣列是直接通過environ變數使其可以為程式可用的,其宣告為:
#include
extern char **environ;
試驗--environ
這裡有乙個showenv.c程式,使用environ變數來列印出環境變數:
#include
#include
extern char **environ;
int main()
exit(0);
}在當我們在乙個linux系統上執行這個程式時,我們會得到類似於下面的輸出,在這裡進行大量的簡寫。這些變數的數量,出現的順序,及其值依賴於作業系統版本,所使用的命令shell,以及程式執行時的使用者設定:
$ ./showenv
hostname=tilde.provider.com
logname=neil
mail=/var/spool/mail/neil
term=console
hosttype=i386
path=/usr/local/bin:/bin:/usr/bin:
home=/usr/neil
ls_options=—8bit—color=tty -f -t 0
shell=/bin/bash
ps1=/h:/w/$
ps2=>
ostype=linux
工作原理
這個程式在environ變數中遍歷來列印出整個環境。
LINUX環境(二) 環境變數
環境變數 getenv,putenv,setenv,unsetenv environ 環境變數 getenv,putenv,setenv,unsetenv 環境變數 getenv 取得環境變數內容 相關函式 putenv setenv unsetenv 表頭檔案 include 定義函式 char ...
Linux環境(二) 環境變數
環境變數 我們在第2章討論了環境變數。這些變數可以用來控制shell指令碼和其他程式的形為。我們也可以使用他們來配置使用者環境。例如,每乙個使用者都有乙個環境變數,home,定義了其使用者主目錄,作為其會話的起始位置。正如我們所知的,我們由shell提示來測試環境變數 echo home home ...
Linux環境(二) 環境變數
環境變數 我們在第2章討論了環境變數。這些變數可以用來控制shell指令碼和其他程式的形為。我們也可以使用他們來配置使用者環境。例如,每乙個使用者都有乙個環境變數,home,定義了其使用者主目錄,作為其會話的起始位置。正如我們所知的,我們由shell提示來測試環境變數 echo home home ...