не могу подавить или использовать ошибку AWS-CLI в bash

У меня есть простой скрипт, который я хочу отображать с помощью 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.

моя цель - получить пустой вывод, когда кластер не найден. для этого я хотел использовать код возврата в условии или поиск строки в выводе.

проблема в том, что вывод не является stdout или stderr, поэтому я даже не могу направить его в /dev/null, чтобы заглушить ошибку.

как я могу заставить этот код работать правильно?:

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

or

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

Спасибо.


person itsme    schedule 28.07.2021    source источник
comment
На самом деле это stderr. Я только что попробовал aws eks describe-cluster --name "test" 2> eks_output. В моем терминале ничего не появилось, и файл eks_output содержал ваш код ошибки: An error occurred (ResourceNotFoundException) when calling the DescribeCluster operation: No cluster found for name: test. Также echo $? после запуска сообщает код возврата 254.   -  person JNevill    schedule 28.07.2021
comment
he issue is that the output is not stdout or stderr Сомневаюсь, но для подтверждения: запустите команду под strace и отследите вызов write, который печатает это сообщение, и отследите файловый дескриптор, в который записано это сообщение.   -  person KamilCuk    schedule 28.07.2021
comment
Поскольку это ответ stderr, если вы просто хотите подавить ошибку, вы можете сделать: EKS_NAME=$(aws eks describe-cluster --name ${CUSTOMER_NAME} >2 /dev/null). Таким образом, ваша переменная EKS_NAME либо пуста, либо заполнена ответом json, если он был успешным.   -  person JNevill    schedule 28.07.2021
comment
2›/dev/null сделал свое дело. я не знаю, как я пропустил это ... извините и спасибо, ребята.   -  person itsme    schedule 28.07.2021
comment
Отвечает ли это на ваш вопрос? Как подавить сообщения об ошибках сценария оболочки?   -  person Aserre    schedule 28.07.2021


Ответы (1)


Вот рассмотрение и расширение моих комментариев. Опять же, вы получаете ответ stderr, когда кластер не найден, так что это довольно просто.

Использование >2 /dev/null для подавления этого возвращаемого сообщения в stderr. Затем используйте 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

В качестве примера.

person JNevill    schedule 28.07.2021