| 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 |