首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >envsubst:未设置变量的默认值

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

Stack Overflow用户
提问于 2018-05-08 17:30:14
回答 3查看 12.7K关注 0票数 11

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

代码语言:javascript
复制
{
  "variable" : "${ENV_VAR}"
}

当然,我可以像下面这样从bash调用envsubst:

代码语言:javascript
复制
$ export ENV_VAR=myvalue
$ envsubst < input.json > output.json
$ cat output.json
{
  "variable" : "myvalue"
}

现在,我希望我可以在未设置ENV_VAR的情况下为input.json中的变量设置默认值,如下面的示例所示,不幸的是,在下面的示例中可以看到,它不起作用:

代码语言:javascript
复制
$ 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 (不涉及输入文件),它就能工作

代码语言:javascript
复制
$ 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

文件的问题出在哪里?

EN

回答 3

Stack Overflow用户

发布于 2018-05-09 20:15:03

根据man envsubst的说法,envsubst只会以${VAR}$VAR的形式替换对环境变量的引用。不支持像${VAR:-default}这样的特殊外壳功能。您可以做的唯一一件事就是(重新)定义envsubst调用环境中的所有变量,并分配本地缺省值(如果缺少):

代码语言:javascript
复制
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的值不为空,否则它实际上会展开为default。执行命令envsubst,将文件input.json作为标准输入接收,并将其标准输出重定向到output.json (两者都是由shell完成的)。执行完命令后,shell会删除命令环境,返回到其原始环境,即局部变量分配不再有效。

没有办法从JSON文件内部定义默认值,除非您自己实现一个程序来这样做,或者使用其他可以这样做的工具。

您可以执行以下操作,但不推荐使用

代码语言:javascript
复制
eval echo "$(cat input.json)" > output.json

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

票数 19
EN

Stack Overflow用户

发布于 2020-03-06 17:25:59

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

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

代码语言:javascript
复制
echo 'welcome $HOME ${USER:=a8m}' | envsubst
票数 5
EN

Stack Overflow用户

发布于 2020-10-25 20:25:04

我正在使用https://github.com/a8m/envsubst,它对原始的

envsubst进行了增强,使模板文件中的表达式支持默认值。

类似地,也可以使用名为'envsub‘的Rust变体,它也支持默认值。参见https://github.com/stephenc/envsub

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50230361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档