linux envsubst:未设置变量的默认值

gab6jxml  于 2023-01-12  发布在  Linux
关注(0)|答案(4)|浏览(281)

我有一个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中的变量设置默认值,就像下面的示例一样,不幸的是,在下面的示例中可以看到,它不起作用:

$ 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

文件有什么问题?

cwtwac6a

cwtwac6a1#

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

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

注意,这实际上是一个命令行,它被分成了多行,每一行都以行续行符\结尾。前两行是变量赋值,只在最后一行执行的命令envsubst的环境中有效。shell将为命令的执行创建环境(它总是这样)。该环境最初是当前shell环境的副本。在该新环境中,ENV_VAROTHER_VAR被赋予展开表达式${VAR:-default}的值,除非定义了VAR并且VAR具有非空值,否则default基本上扩展为default。执行命令envsubst,接收文件input.json作为标准输入并将其标准输出重定向到output.json(两者都由 shell 完成,对命令透明)在命令执行之后, shell 删除命令环境返回到其原始环境,即局部变量赋值不再有效。
没有办法从JSON文件内部定义默认值,除非您自己实现一个程序来定义默认值,或者使用其他工具来定义默认值。
您可以执行以下操作,但不推荐

eval echo "$(cat input.json)" > output.json

它将input.json读入字符串,然后eval评估命令echo <string>,就好像它是按字面输入的一样,这意味着任何嵌入的${VAR:-default}内容都应该在字符串传递给echo之前由shell展开。但是任何其他嵌入的shell功能也将被评估,这会带来巨大的安全风险

dbf7pr2w

dbf7pr2w2#

我使用的是https://github.com/a8m/envsubst,它比原始的gettextenvsubst有增强,模板文件中的表达式支持默认值。
README中的示例非常有效。

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

zhte4eai3#

我使用的是https://github.com/a8m/envsubst,它比原始的gettext envsubst有了增强,模板文件中的表达式支持默认值。
类似地,Rust的一个名为“envsub”的变体也支持默认值。

zaq34kh6

zaq34kh64#

还有https://github.com/busyloop/envcat,它支持复杂的模板(所以你不仅可以设置默认值,还可以设置条件等)。

相关问题