首页 > 解决方案 > 无法在 bash 中抑制或使用 AWS-CLI 错误

问题描述

我有一个简单的脚本,我想使用 AWS CLI 显示来自 AWS 的特定信息。

例如:

get_cluster_name() {
EKS_NAME=$(aws eks describe-cluster --name ${CUSTOMER_NAME}) && \
echo $EKS_NAME | jq -r .cluster.name}

集群存在时的输出是好的,我得到集群的名称。

当集群不存在时,我得到:

An error occurred (ResourceNotFoundException) when calling the DescribeCluster operation: No cluster found for name: example_cluster.

我的目标是在找不到集群时获得空输出。为此,我想在条件中使用返回码或在输出中使用字符串查找。

问题是输出不是标准输出或标准错误,因此我什至不能将它定向到 /dev/null 只是为了消除错误。

我怎样才能使这段代码正常工作?:

[[ $(get_cluster_name) =~ "ResourceNotFoundException" ]] && echo "EKS Cluster:....$(get_cluster_name)"

或者

[[ $(get_cluster_name) ]] && echo "EKS Cluster:....$(get_cluster_name)"

谢谢你。

标签: bashstdoutaws-clistderr

解决方案


这是对我的评论的考虑和扩展。stderr当没有找到集群时,您再次收到响应,因此这使得这非常简单。

用于抑制stderr>2 /dev/null中的返回消息。然后使用ret=$?捕获返回码。

get_cluster_name() {
  EKS_NAME=$(aws eks describe-cluster --name ${CUSTOMER_NAME} 2> /dev/null);
  ret=$?
  if [ $ret -eq 0 ]; then
     echo $EKS_NAME | jq -r .cluster.name
     return 0
  else
     return $ret
  fi
}

现在,当您调用该函数时,您可以执行相同的操作,因为您的错误将从aws命令向上传播到堆栈:

cluster=$(get_cluster_name)
ret=$?
if [ $ret -eq 0 ]; then
  echo $cluster
else
  echo "failed to find cluster. Error code: $ret"
fi

举个例子。


推荐阅读