用/ etc / environment中的环境variables用磅(散列)标记值

在Ubuntu 12.04上,我有一个在/etc/environment定义的环境variables,如下所示:

 FOO="value_before#value_after" 

当我ssh进入服务器来检查值,我得到这个:

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

和以上其他各种组合。 当你通常在shell中设置它们的时候,很多这些都可以工作。 但是他们似乎没有在/etc/environment文件中工作。

这由pam_env模块读取。 假设pam_env模块期望它们是“简单的”KEY = 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'; 

上面的代码片段遍历VALUE部分的每个字符,直到find\n#\0 。 然后用\0覆盖那个字符。

这有效地剥离了以下所有内容。 注:这是一个function不是一个错误。 这是评论function。

所以,在这一点上,你不能在/etc/environment中包含一个#或一个\n\0值在值中间的值。 它也看起来像代码中的键需要字母数字。

我从来没有能够在/etc/environmentfind解决此限制的方法,文档似乎声明/etc/environment是一个简单的环境文件:

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

这可能意味着它不会让你用引号或\字符转义值,尽pipe文档中的其他地方可能会说这是可能的 :

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

无论如何,为了解决这个限制,我将我的全局环境variables移到了/etc/profile.d文件中,正如本答案所讨论的那样 。 我仍然认为这个问题没有得到答复,但我想确保后代有一个联系解决方法。

在/ etc / environment中,当它被PAM模块“pam_env”parsing时,它不能在/ etc / environment中将其转义(因为它被视为注释),并将其视为一个简单的KEY = VAL对列表,环境相应。 它不是bash / shell,parsing器没有用于执行可变扩展或字符转义的语言。

单引号。

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