Сохраните вывод команды kubectl в переменной в Bashscript

#bash #shell #kubectl

Вопрос:

Просто хочу сохранить выходные данные команды kubectl в переменной в скрипте Bash.

Например: kubectl get all -n mattermost вывод команд No resources found in mattermost namespace.

 foo=$(kubectl get all -n mattermost)

while [ "$foo" = "No resources found in mattermost namespace." ]
do
  echo "yay"
done

 

К сожалению, выходные данные не будут сохранены в переменной..

Ответ №1:

С вашим сценарием есть две проблемы…

  1. Проблема, которую вы описали, заключается в том, что вы пытаетесь поймать сообщение об ошибке, но ловите только обычные массажи. Bash и другие оболочки используют stdin stdout и stderr для обмена сообщениями. С помощью вашей команды переменная будет перехватывать только stdout.
  • 2 = stderr
  • 1 = выход из строя
  • 0 = stdin
  • amp; = означает, что некоторые, например, добавляют это к этому
  • < > = куда пойти с stdxxx

Это должно быть больше похоже …

 foo=$(ANY COMMAND 2>amp;1)
 
  1. Когда вы запустите скрипт, он сначала создаст эту переменную, а после этого цикл будет бесконечным, потому что в этой переменной нет изменений.
    Вместо этого вы могли бы избавиться от этой переменной и поместить ее в свой цикл.
 while [ "$(kubectl get all -n mattermost 2>amp;1)" = "No resources found in mattermost namespace." ]; do
echo "Hello World"
done
 

Таким образом, ваш цикл остановится, когда изменится stderr или stdout. Существует также возможность остановить цикл с break помощью или остановить сценарий с return помощью или exit (в зависимости от того, как вы будете запускать этот сценарий).

Комментарии:

1. Спасибо за подробное объяснение

Ответ №2:

Для сообщения типа «Ресурсы не найдены….» оно печатается в stderr. Чтобы исправить это, вы можете изменить свою строку следующим образом

 foo=$(kubectl get all -n mattermost 2>amp;1)