envsubst:未设置变量的默认值

时间:2018-05-08 09:30:14

标签: linux bash environment-variables

我有一个json文件input.json,如下所示:

{
  "variable" : "${ENV_VAR}"
}

当然,我可以从bash中调用envsubst,如下所示:

$ export ENV_VAR=myvalue
$ envsubst < input.json > output.json
$ cat output.json
{
  "variable" : "myvalue"
}

现在,我希望在未设置ENV_VAR的情况下,我可以为input.json中的变量设置默认值,如下例所示,不幸的是,在下面的示例中可以看到,并且#39; t work:

$ cat input.json
{
  "variable" : "${ENV_VAR:=defaultvalue}"
}
$ export ENV_VAR=newvalue
$ envsubst < input.json > output.json
$ cat output.json
{
  "variable" : "${ENV_VAR:=defaultvalue}"
}
$ unset ENV_VAR
$ envsubst < input.json > output.json
$ cat output.json
{
  "variable" : "${ENV_VAR:=defaultvalue}"
}

有什么好奇的,如果我执行envsubst,如下例所示(不涉及输入文件),它可以工作

$ export ENV_VAR=myvalue
$ echo "value is ${ENV_VAR:=defaultvalue}" | envsubst
value is myvalue
$ unset ENV_VAR
$ echo "value is ${ENV_VAR:=defaultvalue}" | envsubst
value is defaultvalue

文件的问题在哪里?

3 个答案:

答案 0 :(得分:9)

根据man envsubstenvsubst只会以${VAR}$VAR的形式替换对环境变量的引用。不支持${VAR:-default}等特殊shell功能。您唯一能做的就是(重新)定义envsubst调用环境中的所有变量,并分配本地默认值(如果它们丢失):

ENV_VAR="${ENV_VAR:-defaultvalue}" \
OTHER_VAR="${OTHER_VAR:-otherdefault}" \
envsubst < input.json > output.json

请注意,这实际上是一个单独的命令行,分为多行,每行以行继续\结尾。前两行是变量赋值,仅在最后一行中执行的命令envsubstr的环境中有效。发生的事情是,shell将创建一个执行命令的环境(就像它一直这样)。该环境最初是当前shell环境的副本。在新环境ENV_VAROTHER_VAR内分配了扩展表达式${VAR:-default}的值,除非定义default并且没有VAR,否则基本上会扩展为envsubst - 空价值。执行命令input.json,接收文件output.json作为标准输入,并将其标准输出重定向到eval echo "$(cat input.json)" > output.json (两者都由shell完成)。命令执行后,shell删除返回其原始环境的命令环境,即局部变量赋值不再有效。

无法从JSON文件中定义默认值,除非您自己实现程序,或者使用其他可以执行此操作的工具。

您可以执行以下操作,但 NOT WOMMENDED

input.json

eval读入字符串,而不是echo <string>使用命令${VAR:-default},就好像它是字面上的类型一样,这意味着任何嵌入的echo内容都应该是在将字符串传递给{{1}}之前由shell扩展。 任何其他嵌入式shell功能也将被评估,这会带来巨大的安全风险

答案 1 :(得分:2)

我使用的是https://github.com/a8m/envsubst,它对原始gettext envsubst进行了增强,即模板文件中的表达式支持默认值。

自述文件中的示例正常工作。

echo 'welcome $HOME ${USER:=a8m}' | envsubst

答案 2 :(得分:0)

Blockquote 我正在使用https://github.com/a8m/envsubst,它对原始gettext envsubst进行了增强,该模板模板中的表达式支持默认值。

类似地,提供了一个名为'envsub'的Rust变体,它也支持默认值。参见https://github.com/stephenc/envsub