我想知道 /etc/environment 的确切语法。我知道这不是一个普通的 shell 脚本,但是单引号和双引号到底是如何处理的?
文件中前面定义的环境变量可以用于定义后面的变量吗?
逃跑如何进行?如果值中有空格会怎样?
另外 - 文件何时处理?网上有冲突的信息称,它是在系统启动时、每次用户登录时或两者兼而有之时进行处理的。
我无法在网上找到这些详细信息;谁能指点我权威文档?
如果重要的话,我对 Ubuntu (Debian) 特别感兴趣。
答案1
很奇怪,我之前就测试过。这个行为有点……奇怪。
这些设置位于/etc/environment
:
FOO1=bar
FOO2="bar"
FOO3="bar
FOO4=bar"
FOO5='bar'
FOO6='bar"
export FOO7=bar
FOO8=bar bar bar
#FOO9=bar
FOO10=$PATH
FOO11="foo#bar"
给出这些环境变量:
FOO1=bar
FOO2=bar
FOO3=bar
FOO4=bar"
FOO5=bar
FOO6=bar
FOO7=bar
FOO8=bar bar bar
FOO10=$PATH
FOO11=foo
换句话说:
- 它跳过前导
export
(7) - 如果该值以单引号或双引号开头,则会删除该值以及任何结尾的单引号或双引号。 (2, 5)
- ...但它不介意引号不匹配,或者最终引号丢失 (3, 6)
- 即使没有引号,它也不特殊对待空格 (8)
- ...甚至没有尾随空格,这在这里很难显示,但我也测试了 (8)
#
它忽略以(9)开头的行- ...并在 a 处剪切行
#
,即使它位于引号之间 (11) - 它不支持变量扩展 (10)
它由 读取pam_env.so
,因此您希望它记录在pam_env
联机帮助页, 或者environment
手册页,但他们没有提到引号的处理。除了测试之外,您还必须解析代码中的行为拉斯克斯的回答链接到。
我想它会尝试接受您放入 shell 启动文件中的分配,以便export FOO="bar bar"
在两者中执行相同的操作(前提是您那里没有任何尾随空格)。只是 for 的语法/etc/environment
要简单得多(在我看来,到了愚蠢的程度)。
/etc/environment
也不支持变量扩展等。如上所述,$PATH
文件中的$PATH
值最终以文字形式出现,而不是目录列表。
上面链接的手册页也描述了pam_env.conf
,它具有更丰富的语法并允许变量扩展。但它仍然不是 shell 语法。
有关的:
答案2
该/etc/environment
文件的读取方式是pam_env
不幸的是,官方文档对于格式并不是非常明确;它说:
语法是简单的 KEY=VAL 对,位于单独的行上。可以指定导出指令以实现 bash 兼容性,但会被忽略。当不同的服务需要不同的环境时,这非常有用。
如果你真的很好奇,实际的解析逻辑可以在_parse_env_file
功能在 PAM 源中。具体来说:
/* now we try to be smart about quotes around the value,
but not too smart, we can't get all fancy with escaped
values like bash */
if (key[i] == '=' && (key[++i] == '\"' || key[i] == '\'')) {
for ( t = i+1 ; key[t] != '\0' ; t++)
if (key[t] != '\"' && key[t] != '\'')
key[i++] = key[t];
else if (key[t+1] != '\0')
key[i++] = key[t];
key[i] = '\0';
}
答案3
我将尝试回答你的第二、第四和第五个问题。
该文件的文档位于手册页(man 5 pam_env.conf)。
/etc/environment
后读取pam_env.conf
,并且man 5 pam_env.conf
表示此文件在用户登录时读取。
基本上,只有文件key=value
中的行/etc/environment
。手册页指出,您可以使用该文件/etc/security/pam_env.conf
通过其他可能不存在的变量来设置环境变量。
从手册页来看,关于/etc/security/pam_env.conf
:
每行以变量名称开头,然后每个变量有两个可能的选项
DEFAULT
和OVERRIDE
。DEFAULT
允许管理员将变量的值设置为某个默认值,如果未提供任何值,则假定为空字符串。该OVERRIDE
选项指示pam_env
如果有要使用的值,则应输入其值(覆盖默认值)。当OVERRIDE
不使用时,""
将被假定并且不会进行覆盖。
VARIABLE [DEFAULT=[value]] [OVERRIDE=[value]]
(可能不存在的)环境变量可以在使用该
${string}
语法的值中使用,并且(可能不存在的)PAM_ITEM 也HOME
可以SHELL
在使用该语法的值中使用@{string}
。$
和字符都@
可以通过反斜杠转义以用作文字值 值可以用 分隔""
,"
不支持转义。请注意,您想要使用的许多环境变量可能在调用模块时尚未设置。例如,${HOME}
下面多次使用,但许多 PAM 应用程序不会在您需要时使其可用。特殊变量@{HOME}
和@{SHELL}
被扩展为用户的 passwd 条目中的值。/etc/environment 文件指定要设置的环境变量。该文件必须由单独行上的简单 NAME=VALUE 对组成。 pam_env(8) 模块将读取 pam_env.conf 文件之后的文件。
您还可以使用 shell 的(例如 bash 或 zsh)配置文件或设置类似的环境变量。