官术网_书友最值得收藏!

4.2 環境變量

我們在第2章討論過環境變量。這是一些能用來控制shell腳本和其他程序行為的變量。你還可以用它們來配置用戶環境。例如,每個用戶有一個環境變量HOME,它定義了用戶的家目錄,即該用戶會話的默認開始位置。正如你已看到的,你可以在shell提示符中檢查環境變量:

你也可以使用shell的set命令來列出所有的環境變量。

UNIX規范為各種應用定義了許多標準環境變量,包括終端類型、默認的編輯器、時區等。C語言程序可以通過putenv和getenv函數來訪問環境變量。

環境由一組格式為“名字=值”的字符串組成。getenv函數以給定的名字搜索環境中的一個字符串,并返回與該名字相關的值。如果請求的變量不存在,它就返回null。如果變量存在但無關聯值,它將運行成功并返回一個空字符串,即該字符串的第一個字節是null。由于getenv返回的字符串是存儲在getenv提供的靜態空間中,所以如果想進一步使用它,你就必須將它復制到另一個字符串中,以免它被后續的getenv調用所覆蓋。

putenv函數以一個格式為“名字=值”的字符串作為參數,并將該字符串加到當前環境中。如果由于可用內存不足而不能擴展環境,它會失敗并返回-1。此時,錯誤變量errno將被設置為ENOMEM。

在下面的實驗中,你將編寫一個程序來打印所選的任意環境變量的值。如果給程序傳遞第二個參數,你還將設置環境變量的值。

實驗getenv和putenv

(1)緊接在main函數聲明后的幾行代碼用于確保程序environ.c被正確調用,它只帶有一個或兩個參數:

(2)然后,調用getenv從環境中取出變量的值:

(3)接下來,檢查程序調用時是否有第二個參數。如果有,則通過構造一個格式為“名字=值”的字符串并調用putenv來設置變量的值:

(4)最后,再次調用getenv來查看變量的新值:

運行這個程序,你可以查看和修改環境變量:

注意:環境僅對程序本身有效。你在程序里做的改變不會反映到外部環境中,這是因為變量的值不會從子進程(你的程序)傳播到父進程(shell)。

4.2.1 環境變量的用途

程序經常使用環境變量來改變它們的工作方式。用戶可以通過以下方式設置環境變量的值:在默認環境中設置、通過登錄shell讀取的.profile文件來設置、使用shell專用的啟動文件(rc)或在shell命令行上對變量進行設定。例如:

shell將行首的變量賦值作為對環境變量的臨時改變。在上面的第二個例子中,程序environ將運行在一個變量FRED有一個賦值的環境中。

舉個例子,在CD數據庫應用程序的未來版本中,你可以通過改變一個環境變量,比如CDDB,來指定所用的數據庫。這樣,每個用戶就能指定自己的默認值,或者在每次運行時使用shell命令來設定:

環境變量是一把雙刃劍,使用它的時候要小心!與命令行選項相比,它們對用戶來說更加“隱蔽”,這樣就使得程序的調試變得更加困難。從某種意義上來說,環境變量就像全局變量一樣,它們會改變程序的行為,產生不可預期的結果。

4.2.2 environ變量

正如你已看到的,程序的環境由一組格式為“名字=值”的字符串組成。程序可以通過environ變量直接訪問這個字符串數組。environ變量的聲明如下所示:

實驗environ變量

下面這個程序showenv.c使用environ變量打印環境變量:

當在Linux系統中運行該程序時,你將得到如下的輸出(略做刪減)。這些變量的數目、出現順序和值取決于操作系統的版本、所用的shell以及程序運行時的用戶設置。

實驗解析

這個程序遍歷environ變量(一個以null結尾的字符串數組),并打印出整個環境。

主站蜘蛛池模板: 曲松县| 德安县| 合阳县| 肥东县| 色达县| 张家川| 久治县| 吉林省| 冀州市| 筠连县| 辽宁省| 平武县| 镇远县| 南召县| 呼玛县| 抚远县| 靖安县| 宝清县| 太原市| 炉霍县| 新乡市| 青州市| 垫江县| 同德县| 壶关县| 泾川县| 颍上县| 都兰县| 右玉县| 洪江市| 府谷县| 保定市| 永城市| 都匀市| 苍溪县| 秦安县| 烟台市| 温州市| 青岛市| 乌兰察布市| 彩票|