使用 env 设置包含空间的环境变量

Bai*_*ker 8 bash environment-variables env

我正在尝试env用于为子进程设置环境变量(从另一个来源读取,例如文件)。本质上,我正在尝试以下操作:

env VALUE=thisisatest ./somescript.sh
Run Code Online (Sandbox Code Playgroud)

例如,如果somescript.sh是:

echo $VALUE
Run Code Online (Sandbox Code Playgroud)

然后这将按thisisatest预期打印。但我想从文件中加载变量。我已经到了这一点:

env $(cat .vars | xargs -d '\n') ./somescript.sh
Run Code Online (Sandbox Code Playgroud)

但是,当任何变量包含空格(并且引号不能按预期工作)时我就会遇到麻烦。例如:

env $(echo 'VALUE="this is a test"' | xargs -d '\n') ./somescript.sh
Run Code Online (Sandbox Code Playgroud)

会出错

env: is: No such file or directory
Run Code Online (Sandbox Code Playgroud)

并尝试:

env $(echo 'VALUE="thisisatest"' | xargs -d '\n') ./somescript.sh
Run Code Online (Sandbox Code Playgroud)

会给我意想不到的:

"thisisatest"
Run Code Online (Sandbox Code Playgroud)

我认为这会正常工作,因为运行env VALUE="thisisatest" ./somescript.sh打印它没有引号。

从错误中,我发现由于某种原因 env 不理解引号意味着后面的值应该是一个字符串。但是,我不确定如何以正确解释引号的方式插入这些变量。

任何人都可以提供有关如何完成此操作的任何提示吗?

谢谢!

cuo*_*glm 5

命令替换需要双引号,否则shell会根据命令替换的结果进行字段分割:

$ env "$(echo 'VALUE="this is a test"')" ./somescript.sh
"this is a test"
Run Code Online (Sandbox Code Playgroud)

对于env读取文件时,你必须让外壳程序领域的分裂,而是设定IFS为仅换行,所以你的命令将不会与空间突破:

$ IFS='
'
$ env $(cat .vars) ./somescript.sh
Run Code Online (Sandbox Code Playgroud)

如果您想从文件中读取,最好仅在以下位置提供(又名)文件somescript.sh

#!/bin/bash

. .vars
: The rest of script go here
Run Code Online (Sandbox Code Playgroud)