environ(7)

名稱
environ - 使用者環境

概述
extern char **environ;

描述
變數 environ 指向一個儲存指標的陣列，這些指標指向被稱為“環境（environment）”的字串。陣列中最後一個指標的值為 NULL。該字串陣列在新程式啟動時被 execve(2) 呼叫提供給程序。當子程序被 fork(2) 建立時，它繼承其父程序環境的一份副本。

習慣上約定在 environ 中的字串有類似“名稱=值”的形式。其中的名稱是大小寫敏感的，且不能包含字元“=”。其中的值可以為任何字串可以表示的文本。名稱和值不能包含內嵌的空位元組字元（'\0'），以此避免其被誤認為字串終止位置。

環境變數可由 sh(1) 中的 export 命令在 shell 的環境中被設定，或者在使用 csh(1) 時使用 setenv 命令。

對 shell 來說，其初始的環境相關變數可經由多種方式被填充，如在使用了 pam(8) 的系統上，pam_env(8) 會對所有使用者在登入時啟用 /etc/environment 中的定義。除此之外，許多 shell 初始化指令碼，如系統層級的 /etc/profile 指令碼和各個使用者的初始化指令碼，可能包含一些會向 shell 的環境中新增變數的命令；請參考您使用的 shell 的手冊頁瞭解詳細資訊。

Bourne 風格的 shell 支援下面的語法

    名稱=值 命令

它可被用來僅在執行 命令 時建立對應的環境變數定義。在 命令 之前，可以存在多個變數定義，其間使用空格進行分隔。

引數還可以在呼叫 exec(3)時被放置於環境之中。C 程式可以使用諸如 getenv(3), putenv(3), setenv(3) 和 unsetenv(3) 的函式操縱其環境。

本文的下述部分列出了系統上常見的環境變數。這個列表並不完整，且僅包含普通使用者在日常使用中常見的變數。特定程式或軟體庫函式所使用的環境變數通常會在其對應的手冊頁中的“環境”一節中進行描述。

USER
    已登入使用者的名稱（被某些 BSD 衍生的程式所使用）。其在登入時被設定，請見下文的備註一節。

LOGNAME
    已登入使用者的名稱（被某些 System-V 衍生的程式所使用）。其在登入時被設定，請見下文的備註一節。

HOME
    使用者登入時的目錄。其在登入時被設定，請見下文的備註一節。

LANG
    用於語言和區域設定類別的名稱，它在未被 LC_ALL 或更具體的環境變數，如 LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC 和 LC_TIME 所覆蓋時生效（請參見 locale(7) 以瞭解 LC_* 環境變數的具體細節）。

PATH
    它是一系列目錄字首，可被 sh(1) 和許多其他程式所使用以搜尋由簡單的檔名（即不含有斜線的路徑名）所指定的執行檔。各個字首之間被冒號（:）所分隔。整個字首列表會被從前到後進行搜尋，程式會檢查給定路徑名在附加字首、斜線和檔名之後的路徑是否存在，直到找到一個符合條件的執行檔為止。

    還存在一個遺留的特性：如果字首長度為零（即由兩個相鄰的冒號組成，或者有起始或終止位置的冒號存在），該字首會被解釋為指定當前工作目錄。然而，當前已不推薦使用該特性，且 POSIX 認為一個符合標準的應用程式應當使用顯式的路徑名（如 .）來指定當前工作目錄。

    類似 PATH，還存在 CDPATH 會被某些 shell 用來尋找更改目錄指令的目標目錄，以及被 man(1) 所使用尋找手冊頁的 MANPATH，等等。

PWD 當前工作目錄的絕對路徑。它的組成部分必須被規範化（即不可出現 . 或 .. 的路徑部分）。

SHELL
    使用者登入 shell 的絕對路徑名。其在登入時被設定，請見下文的備註一節。

TERM
    輸出應當相容的終端型別。

PAGER
    使用者偏好的顯示文本檔案的實用工具。可被設定為任何 sh -c 命令可接受的命令字串運算子。如果 PAGER 的值為空或未被設定，則啟動分頁器的應用程式會預設選擇一個程式，如 less(1) 或 more(1)。

EDITOR/VISUAL
    使用者偏好使用的編輯文本檔案的工具。可被設定為任何 sh -c 命令可接受的命令字串運算子。

請注意，許多程式和軟體庫例程的行為都會受到特定環境變數存在與否及其取值的影響。下面給出一些例子：

•   LANG, LANGUAGE, NLSPATH, LOCPATH, LC_ALL, LC_MESSAGES 等等變數會影響語言和區域設定的處理；請參見 catopen(3), gettext(3) 和 locale(7)。

•   TMPDIR 影響由 tempnam(3) 和其他例程建立的路徑名稱的字首，以及由 sort(1) 和其他程式所使用的臨時目錄名。

•   LD_LIBRARY_PATH, LD_PRELOAD 和其他 LD_* 變數會影響動態載入器/連結器的行為。請參見 ld.so(8)。

•   POSIXLY_CORRECT 使得特定的程式和軟體庫例程遵循 POSIX 所指定的行為。

•   malloc(3) 的行為受到 MALLOC_* 變數的影響。

•   HOSTALIASES 變數給出包含 gethostbyname(3) 將要使用的主機別名的檔案的名稱。

•   TZ 和 TZDIR 給出 tzset(3) 所使用的時區資訊，並涉及諸如 ctime(3), localtime(3), mktime(3), strftime(3) 等函式。另請參見 tzselect(8)。

•   TERMCAP 提供如何處理給定終端的相關資訊（或者給出包含這些資訊的檔案的檔名）

•   COLUMNS 和 LINES 會告知應用程式視窗大小資訊，它可能會覆蓋實際大小的配置。

•   PRINTER 或 LPDEST 可能指定要使用的印表機。請見 lpr(1)。

備註
歷史上以及標準上，environ 必須被使用者程式所宣告。然而，一個現存的不標準的方便程式設計師工作的方法是將 environ 宣告在 <unistd.h> 標頭檔案中，前提是 _GNU_SOURCE 功能測試宏已被定義（參見 feature_test_macros(7)）。

prctl(2) 中的 PR_SET_MM_ENV_START 和 PR_SET_MM_ENV_END 操作可被用來控制程序環境的位置。

HOME, LOGNAME, SHELL 和 USER 變數會在使用者經由會話管理介面被變更時被設定。者通常是經由類似 login(1) 的程式以及使用者資料庫（例如 passwd(5)）所完成的。（使用 su(1) 切換到 root 使用者可能導致混合的環境變數，其中 LOGNAME 和 USER 被保留為舊有使用者的值；參見 su(1) 手冊頁。）

缺陷
很顯然，這個機制有安全風險。許多系統命令可被使用者指定的不同尋常的 IFS 或 LD_LIBRARY_PATH 的值所欺騙。

還存在名稱空間汙染的風險。如 make 和 autoconf 等程式允許環境中具有和實用工具相同命名（但全大寫）的變數覆蓋預設所使用的工具路徑。因此，使用者可以使用 CC 來選擇想要使用的 C 編譯器（類似地，還有 MAKE, AR, AS, FC, LD, LEX, RM, YACC 等等）。然而，在某些傳統的使用場景中這些環境變數還會被賦值為程式選項而非路徑名，例如 MORE 和 LESS。這些用法被認為是錯誤的，應當在新程式中避免。

參見
bash(1), csh(1), env(1), login(1), printenv(1), sh(1), su(1), tcsh(1), execve(2), clearenv(3), exec(3), getenv(3), putenv(3), setenv(3), unsetenv(3), locale(7), ld.so(8), pam_env(8)

跋
本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃：https://github.com/man-pages-zh/manpages-zh