| environ(7) | Miscellaneous Information Manual | 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) 的函式操縱其環境。
本文的下述部分列出了系統上常見的環境變數。這個列表並不完整,且僅包含普通使用者在日常使用中常見的變數。特定程式或軟體庫函式所使用的環境變數通常會在其對應的手冊頁中的“環境”一節中進行描述。
請注意,許多程式和軟體庫例程的行為都會受到特定環境變數存在與否及其取值的影響。下面給出一些例子:
歷史上以及標準上,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
| 2024-06-15 | Linux 手冊頁 6.9.1 |