/ etc / environment中的环境变量(带有井号(井号))将值


10

在Ubuntu 12.04上,我具有如下定义的环境变量/etc/environment

FOO="value_before#value_after"

当我进入服务器检查值时,得到以下信息:

$ env | grep FOO
FOO=value_before

我猜它正在将#视为注释并删除它,但是,这可行:

$ . /etc/environment
$ export FOO
$ env | grep FOO
FOO=value_before#value_after

我已经尝试过这样的转义#

FOO="value_before\#value_after"

但这是行不通的,相反,我得到了这个:

FOO=value_before\

关于如何使哈希成为值一部分的任何想法?任何帮助都会很棒。

我在/etc/environment文件中尝试过的值:

FOO='value_before#value_after'
FOO="value_before#value_after"
FOO='"value_before#value_after"'
FOO="value_before\#value_after"
FOO='value_before\#value_after'

以及以上的其他各种组合。只要将它们通常设置在外壳中,它们中的许多都将起作用。但是它们似乎在/etc/environment文件中不起作用。

Answers:


5

这是由pam_env模块读取的。假设pam_env模块希望它们是“简单”的KEY = VALUE对(不需要引号),并且还支持由#标识的注释,则假定#和VALUE中紧随其后的所有内容均为注释。另外,请注意,它不支持任何转义概念。

在以下来自pam_env.c的_parse_env_file函数的代码段中可以看到。

/* now find the end of value */
mark = key;
while(mark[0] != '\n' && mark[0] != '#' && mark[0] != '\0')
    mark++;
if (mark[0] != '\0')
    mark[0] = '\0';

上面的片段走值部分中的每个字符,直到它找到一个\n#\0。然后用覆盖该字符\0

这样可以有效地删除#和之后的所有内容。注意:这是一项功能,并非错误。这是评论功能。

因此,在这一点上,您不能在/etc/environment其中包含a #或a \n\0值的值。从代码看来,这些键也必须是字母数字。


哇,钉了!感谢您的详细说明,我将其标记为可接受的解决方案。
Jaymon

3

我从未在中找到解决此限制的方法/etc/environment,文档似乎指出这/etc/environment是一个简单的环境文件:

This module can also parse a file with simple KEY=VAL pairs on separate 
lines (/etc/environment by default).

这可能意味着它不会让您使用引号或\字符对值进行转义,尽管文档中的其他地方可能说这是可能的

(Possibly non-existent) environment variables may be used in values using 
the ${string} syntax and (possibly non-existent) PAM_ITEMs may be used in 
values using the @{string} syntax. Both the $ and @ characters can be 
backslash escaped to be used as literal values values can be delimited with ""

也许不是

The file is made up of a list of rules, each rule is typically placed on a
single line, [...] Comments are preceded with `#´ marks and extend to the 
next end of line.

无论如何,为了解决这个限制,我将全局环境变量移动到了文件中,/etc/profile.d本答案所述。我仍然认为这个问题没有答案,但是我想确保后代有一个链接的解决方法。


1

/ etc / environment中没有办法转义#(因为它被视为注释),因为它已被PAM模块“ pam_env”解析,并将其视为KEY = VAL对的简单列表并设置了环境相应。它不是bash / shell,解析器没有进行变量扩展或字符转义的语言。


0

单引号。

$ FOO='foo#bar'
$ echo $FOO
foo#bar

1
那是我尝试的第一个值,虽然它可以在shell中使用,但不幸的是,它不适用于/etc/environment,我已经用一些我尝试过的值示例更新了我的问题。
Jaymon 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.