gpt4 book ai didi

linux - envsubst : default values for unset variables

转载 作者:IT王子 更新时间:2023-10-29 00:25:39 44 4
gpt4 key购买 nike

我有一个 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

文件哪里有问题?

最佳答案

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

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

请注意,这实际上是将单个命令行拆分为多行,每行以续行结尾 \ .前两行是变量赋值,只在执行命令的环境下有效 envsubst在最后一行。发生的事情是,shell 将为执行命令创建一个环境(就像它总是做的那样)。该环境最初是当前 shell 环境的副本。在那个新环境中 ENV_VAROTHER_VAR被赋予扩展表达式 ${VAR:-default} 的值,基本上扩展为 default除非VAR已定义且具有非空值。命令envsubst被执行,收到文件 input.json作为标准输入并将其标准输出重定向到 output.json (两者都由 shell 完成,对命令透明)。命令执行后,shell删除命令环境,返回原来的环境,即局部变量赋值不再有效。

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

您可以执行如下操作,但不推荐:

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

将显示为 input.json变成一个字符串,然后比 eval执行命令 echo <string>就好像它是字面上的类型,这意味着任何嵌入的 ${VAR:-default}在将字符串传递给 echo 之前,shell 应该扩展 stuff . 但是任何其他嵌入式 shell 功能也将被评估,这会带来巨大的安全风险

关于linux - envsubst : default values for unset variables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50230361/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com