为什么我在 /etc/environment 中定义的环境变量中得到这个额外的引号?

Nic*_*ick 2 linux bash environment-variables node.js

在我们的 CentOS 服务器中,env 变量NODE_OPTIONS被设置为错误的值。我检查了一些可能的文件,例如 /etc/environment、/etc/profile,但没有运气。我也尝试从 /etc/ 中 grep 它,但仍然没有运气。这让我心烦意乱。

我什至试过这个:https : //unix.stackexchange.com/a/154971/92712

惊讶地发现输出中没有这样的变量。但它在

printenv NODE_OPTIONS 
set | grep NODE_OPTIONS
echo $NODE_OPTIONS
Run Code Online (Sandbox Code Playgroud)

(外壳是bash)

有没有办法进入这个 NODE_OPTIONS 来自哪个文件?


更多信息:

$ node -v
node: invalid value for NODE_OPTIONS (unterminated string)

$ echo $NODE_OPTIONS
--max-old-space-size=5120"

$ cat /etc/environment  
export NODE_OPTIONS="--max-old-space-size=5120"
Run Code Online (Sandbox Code Playgroud)

更新:

谢谢@ilkkachu

$ declare -p NODE_OPTIONS
declare -x NODE_OPTIONS="--max-old-space-size=5120\" "
Run Code Online (Sandbox Code Playgroud)

更新 2:额外的双引号也出现在env输出中:

$ env
NODE_OPTIONS=--max-old-space-size=5120"
Run Code Online (Sandbox Code Playgroud)

更新 3:谢谢@Johan Myréen

$ od -c /etc/environment
0000000  \n   e   x   p   o   r   t       N   O   D   E   _   O   P   T
0000020   I   O   N   S   =   "   -   -   m   a   x   -   o   l   d   -
0000040   s   p   a   c   e   -   s   i   z   e   =   5   1   2   0   "
0000060       #   i   n   c   r   e   a   s   e       t   o       5   g
0000100   b  \n  \n
0000103
Run Code Online (Sandbox Code Playgroud)

ilk*_*chu 5

$ cat /etc/environment  
export NODE_OPTIONS="--max-old-space-size=5120"
Run Code Online (Sandbox Code Playgroud)

所以,/etc/environment这有点奇怪。它由 读取pam_env.so手册页说它应该包含“单独行上的简单 KEY=VAL 对”,但手册页的某些版本说“可以指定导出指令以实现 bash 兼容性,但将被​​忽略.”

在任何情况下,它都不会被 shell 读取,也不支持所有的 shell 语法。手册页没有提到引号,也不支持反斜杠转义或扩展其他变量,即诸如PATH=$PATH:/some/pathFOOPATH=$HOME/foo不起作用之类的东西。

但是,这还不是全部,因为它似乎确实将#符号视为注释标记,即使在一行的中间,至少在我的 Debian 上,它确实从值的开头和结尾删除了引号(如果存在),但是不关心他们是否匹配

例如左边的两行,我得到右边的两个值:

/etc/environment 结果变量
TEST1="hash#sign" TEST1=hash
TEST2="mixed quotes' TEST2=mixed quotes

根据您的od输出,您/etc/environment实际上包含以下行:

export NODE_OPTIONS="--max-old-space-size=5120" #increase to 5gb
Run Code Online (Sandbox Code Playgroud)

它在井号上被切断,但由于结束引号后的空格,引号无法识别或删除,并且您在值中同时获得空格和引号。

要按照手册中关于“简单键=值对”的说明,您可以使用:

# increase to 5 GB
NODE_OPTIONS=--max-old-space-size=5120
Run Code Online (Sandbox Code Playgroud)

但根据上面的注释export和观察,这可能也有效:

# increase to 5 GB
export NODE_OPTIONS="--max-old-space-size=5120"
Run Code Online (Sandbox Code Playgroud)

只需注意清理任何尾随空格,它们可能会出现在值中或导致其他问题。

有关的:

  • @JohanMyréen,是的。在那里支持 shell 语法确实有一定意义,但是正确执行这有点烦人,尤其是。因为 shell 支持的引用样式各不相同。现在的方式有点太糟糕了,但可能永远无法修复,因为野外存在带有“export”和引号的文件。从好的方面来说,可以说服他们在查看末尾引用之前让代码删除尾随空格,无论如何实际上很少需要这些空格,并且已经不可能通过文件设置任意值。 (2认同)