我有一个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
文件有什么问题?
4条答案
按热度按时间cwtwac6a1#
根据
man envsubst
,envsubst
只会替换${VAR}
或$VAR
形式的环境变量引用。不支持${VAR:-default}
等特殊shell功能。您唯一可以做的是(重新)定义envsubst
调用环境中的所有变量,并分配本地默认值(如果缺少这些值):注意,这实际上是一个命令行,它被分成了多行,每一行都以行续行符
\
结尾。前两行是变量赋值,只在最后一行执行的命令envsubst
的环境中有效。shell将为命令的执行创建环境(它总是这样)。该环境最初是当前shell环境的副本。在该新环境中,ENV_VAR
和OTHER_VAR
被赋予展开表达式${VAR:-default}
的值,除非定义了VAR
并且VAR
具有非空值,否则default
基本上扩展为default
。执行命令envsubst
,接收文件input.json
作为标准输入并将其标准输出重定向到output.json
(两者都由 shell 完成,对命令透明)在命令执行之后, shell 删除命令环境返回到其原始环境,即局部变量赋值不再有效。没有办法从JSON文件内部定义默认值,除非您自己实现一个程序来定义默认值,或者使用其他工具来定义默认值。
您可以执行以下操作,但不推荐:
它将
input.json
读入字符串,然后eval
评估命令echo <string>
,就好像它是按字面输入的一样,这意味着任何嵌入的${VAR:-default}
内容都应该在字符串传递给echo
之前由shell展开。但是任何其他嵌入的shell功能也将被评估,这会带来巨大的安全风险。dbf7pr2w2#
我使用的是https://github.com/a8m/envsubst,它比原始的gettextenvsubst有增强,模板文件中的表达式支持默认值。
README中的示例非常有效。
zhte4eai3#
我使用的是https://github.com/a8m/envsubst,它比原始的gettext envsubst有了增强,模板文件中的表达式支持默认值。
类似地,Rust的一个名为“envsub”的变体也支持默认值。
zaq34kh64#
还有https://github.com/busyloop/envcat,它支持复杂的模板(所以你不仅可以设置默认值,还可以设置条件等)。