我尝试检查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 $@"
是引用$@
的奇怪用法。首选$*
,或者移动到单独的参数