/etc/environment 的语法记录在哪里?

ner*_*com 12 documentation

我想知道 /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)
  • 如果该值以单引号或双引号开头,则会删除该值以及任何结尾的单引号或双引号。(2, 5)
  • ...但它不介意引号不匹配,或者最终引号丢失 (3, 6)
  • 即使没有引号,它也不特殊对待空格 (8)
  • ...甚至没有尾随空格,这在这里很难显示,但我也测试了 (8)
  • 它忽略以#(9)开头的行
  • ...并在 a 处剪切行#,即使它位于引号之间 (11)
  • 它不支持变量扩展 (10)

它是由 阅读的pam_env.so,因此您会期望它记录在pam_envmanpageenvironmentman 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)