我想知道 /etc/environment 的确切语法。我知道这不是一个普通的 shell 脚本,但是单引号和双引号到底是如何处理的?
文件中前面定义的环境变量可以用于定义后面的变量吗?
逃跑如何进行?如果值中有空格会怎样?
另外 - 文件何时处理?网上有冲突的信息称,它是在系统启动时、每次用户登录时或两者兼而有之时进行处理的。
我无法在网上找到这些详细信息;谁能指点我权威文档?
如果重要的话,我对 Ubuntu (Debian) 特别感兴趣。
ilk*_*chu 25
很奇怪,我之前就测试过。这个行为有点……奇怪。
这些设置位于/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"
Run Code Online (Sandbox Code Playgroud)
给出这些环境变量:
FOO1=bar
FOO2=bar
FOO3=bar
FOO4=bar"
FOO5=bar
FOO6=bar
FOO7=bar
FOO8=bar bar bar
FOO10=$PATH
FOO11=foo
Run Code Online (Sandbox Code Playgroud)
换句话说:
export
(7)#
(9)开头的行#
,即使它位于引号之间 (11)它是由 阅读的pam_env.so
,因此您会期望它记录在pam_env
manpage或environment
man page中,但他们没有提到引号的处理。除了测试之外,您还必须从链接到的代码larsks 的答案中解析行为。
我想它会尝试接受您放入 shell 启动文件中的分配,以便export FOO="bar bar"
在两者中执行相同的操作(前提是您那里没有任何尾随空格)。只是 for 的语法/etc/environment
要简单得多(在我看来,到了愚蠢的程度)。
/etc/environment
也不支持变量扩展等。如上所述,$PATH
文件中的$PATH
值最终以文字形式出现,而不是目录列表。
上面链接的手册页也描述了pam_env.conf
,它具有更丰富的语法并允许变量扩展。但它仍然不是 shell 语法。
有关的:
lar*_*sks 16
该/etc/environment
文件由 读取pam_env
。不幸的是,官方文档对于格式并不是非常明确;它说:
语法是简单的 KEY=VAL 对,位于单独的行上。可以指定导出指令以实现 bash 兼容性,但会被忽略。当不同的服务需要不同的环境时,这非常有用。
如果您真的很好奇,可以在PAM 源代码中的_parse_env_file
函数中找到实际的解析逻辑。具体来说:
/* 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';
}
Run Code Online (Sandbox Code Playgroud)