#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:
С вашим сценарием есть две проблемы…
- Проблема, которую вы описали, заключается в том, что вы пытаетесь поймать сообщение об ошибке, но ловите только обычные массажи. Bash и другие оболочки используют stdin stdout и stderr для обмена сообщениями. С помощью вашей команды переменная будет перехватывать только stdout.
- 2 = stderr
- 1 = выход из строя
- 0 = stdin
- amp; = означает, что некоторые, например, добавляют это к этому
- < > = куда пойти с stdxxx
Это должно быть больше похоже …
foo=$(ANY COMMAND 2>amp;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)