导出值包含空格的环境文件

mik*_*ter 5 bash shell environment-variables quoting command-line-arguments

我正在使用环境文件来配置网络应用程序。最近我需要导出这样的值:

RUBYOPT='-W:no-derecated -W:no-experimental'
Run Code Online (Sandbox Code Playgroud)

test.env它包含在具有其他配置变量的文件中。

我使用此命令导出文件中的所有环境变量:

export $(cat test.env | xargs)
Run Code Online (Sandbox Code Playgroud)

使用上面的值,该命令会给出以下错误:

-bash: export: `-W:no-experimental'': not a valid identifier
Run Code Online (Sandbox Code Playgroud)

我可以通过复制粘贴输出来导出值,cat test.env | xargs但在像上面这样的单个命令中它不起作用。

一些测试表明,当值包含空格及其后的冒号时,就会出现问题:

我需要什么样的引用魔法才能使我的环境文件再次工作?

Ted*_*gmo 11

的构造export $(cat test.env | xargs)非常脆弱,你会得到'字符(和其他特殊字符) 的 shell 解释,RUBYOPT='-W:no-derecated -W:no-experimental'因此变成RUBYOPT=-W:no-derecated -W:no-experimental. 注意缺少的'. 除非您设置带有空格的变量,否则这不是问题。

我建议放弃这种导出环境文件中所有变量的方式。

如果您的文件包含未编辑的语法test.env变量赋值,您可以改为打开自动导出,然后获取该文件。bashexporttest.env

例子:

set -a      # turn on automatic exporting
. test.env  # source test.env
set +a      # turn off automatic exporting
Run Code Online (Sandbox Code Playgroud)

BASH_BUILTINSman set):

set -a创建或修改的每个变量或函数都被赋予导出属性,并标记为导出到后续命令的环境。

  • `export $(cat test.env | xargs)` 的具体含义 1. 值 `a="\""` 中的引用将导致错误。 2. 多行值将出错。 3. 任何其他 shell 表达式都将不起作用。 4. 反斜杠不会保留在单引号内。说实话,我不知道你为什么在这里使用 `xargs`,这里使用 `xargs` 只是一个错误,`xargs` 不适合这个。5. `cat 文件| cmd` 是 cat 的无用用法,使用 `< file cmd`。 6. `$(..)` 的结果是_word splitted_ __and__ _filenameexpanded_。空格和制表符不起作用。会出现很多奇怪的情况。 “*”“?”字符的问题。 (2认同)
  • @mikezter 长时间使用某种东西并不是延续不良做法的正当理由。 (2认同)