envsubst命令的奇怪行为



我尝试检查bash脚本中所有命令的命令返回。我为此创建了一个名为check_command_return_code的函数。这个函数在运行命令的其他函数中调用,除了envsubst命令外,它似乎按预期工作。

这是我的check_command_return_code:

check_command_return_code(){
"$@"
if [ "$?" -ne 0 ]; then
echo "[ERROR] Error with command $@"
exit 1
fi
echo "[SUCCESS] Command $@ has successfully run"
}

我还编写了这个函数,以便替换yaml文件中的env变量:

substitute_env_variables_into_file(){
echo "Create new file named $2 from $1 by substituting environment variables within it"
check_command_return_code envsubst < $1 > $2
}

我调用我的函数,它像这样进行替换:

substitute_env_variables_into_file "./ingress-values.yaml" "./ingress-values-subst.yaml"

这是我的入口值。yaml文件:

controller:
replicaCount: 2
service:
loadBalancerIP: "$INTERNAL_LOAD_BALANCER_IP"
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true" 

我期望我的ingress-values-subst。Yaml看起来像这样:

controller:
replicaCount: 2
service:
loadBalancerIP: "my_private_ip"
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal:

不幸的是ingress-values-subst。Yaml用我的check_command_return_code函数的回显展开,如您所见:

controller:
replicaCount: 2
service:
loadBalancerIP: "my_private_ip"
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
[SUCCESS] Command envsubst has successfully run

我启用了"调试">

set -x

这些日志来自我的脚本的输出:

++ substitute_env_variables_into_file ./private-ingress-values.yaml ./private-ingress-values-subst.yaml
++ echo 'Create new file named ./ingress/private-ingress-values-subst.yaml from ./private-ingress-values.yaml by substituting environment variables within it'
Create new file named ./private-ingress-values-subst.yaml from ./private-ingress-values.yaml by substituting environment variables within it
++ check_command_return_code envsubst
++ envsubst
++ '[' 0 -ne 0 ']'
++ echo '[SUCCESS] Command envsubst has successfully run'

我不明白为什么我的命令envsubst的参数没有传递到我的check_command_return_code函数中,正如你在前面的日志中看到的。

提前感谢您的帮助

我不明白为什么我的命令envsubst的参数没有传递到我的check_command_return_code

重定向不是参数。重定向在行执行时打开。

当您执行your_function > file时,则在整个功能期间,your_function内的标准输出将重定向到file,包括your_function内的所有命令。

将其封装在另一个函数中:

myenvsubst() {
envsubst < "$1" > "$2"
}
check_command_return_code myenvsubst "$1" "$2"

或者更好的是,将日志信息写入标准错误,或另一个文件描述符。

echo "[ERROR] Error with command $*" >&2

用shellcheck检查你的脚本,发现这样的问题:

< $1 > $2

不加引号。应该是< "$1" > "$2"

if [ "$?" -ne 0 ]; then

是一个反模式。首选if ! "$@"; then.

echo "[ERROR] Error with command $@"

是引用$@的奇怪用法。首选$*,或者移动到单独的参数

相关内容

  • 没有找到相关文章

最新更新