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 不理解引号意味着后面的值应该是一个字符串。但是,我不确定如何以正确解释引号的方式插入这些变量。
任何人都可以提供有关如何完成此操作的任何提示吗?
谢谢!
命令替换需要双引号,否则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)