Linux環境(二) 環境變數

2021-08-22 15:41:17 字數 3339 閱讀 1636

環境變數

我們在第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 ...