Как отобразить вывод git в bash и сохранить одну строку из вывода в переменной? - PullRequest
0 голосов
/ 11 ноября 2018

Я использую команду git push в bash, которая выдает некоторые ошибки.

RESPONSE=$(git push "$target" --all | grep "error:" || true)

генерирует вывод на экран, но переменная $ RESPONSE пуста

Если я изменю команду для этого:

RESPONSE=$(git push "$target" --all 2>&1 | grep "error:" || true)
Команда

выполняется без вывода сообщений, но фактически фиксирует необходимую ошибку в $ RESPONSE

echo $RESPONSE

ошибка: не удалось отправить некоторые ссылки на 'SSH: //git@git.test.test.com: 7999 / тест / тест-test.git'

Мне действительно нужно выполнить эту команду git push таким образом, чтобы она содержала ошибку, описанную выше в $ RESPONSE, и при этом генерировала весь вывод на экране.

Бег

RESPONSE=$(git push "$target" --all 2>&1 | tee -a log | grep "error:" || true) не помогло, если я что-то упустил.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Одним из решений является использование tee; просто не совсем так, как вы показали. Шаг за шагом, возможно, облегчит понимание:

git push "$target" --all

отправит ошибку, которую вы хотите, в STDERR. Вот почему вы добавили 2>&1, чтобы перенаправить STDERR в STDOUT.

git push "$target" --all 2>&1

Тогда ваш конвейер (grep и т. Д.) Сможет его забрать, и в конечном итоге захват переменной сможет увидеть его, когда вы выполните

RESPONSE=$(git push "$target" --all 2>&1 | grep "error:" || true)

Но поскольку ошибка больше не передается в STDERR и STDOUT теперь записывается, а не отправляется на экран, вывод исчезает.

Итак, для чего вы хотите использовать tee, это поставить выходные данные на и STDERR (для экрана) и STDOUT (для вашего конвейера и возможного захвата переменной).

RESPONSE=$(git push "$target" --all 2>&1 |tee >(cat 1>&2) | grep "error:" || true)

Скорее всего, это сработает так, как вы намереваетесь, но имейте в виду, что все, что вы видите на экране - все выходные данные команды git, ошибка или другое - теперь передается на STDERR.

Существует не так много практических причин, почему это было бы лучше, чем ответ о захвате переменной и последующем ее отображении (согласно ответу miimote), но если по какой-то причине непоследовательная структура команд кажется вам лучше, это способ сделать это.

0 голосов
/ 11 ноября 2018

Первая строка

RESPONSE=$(git push "$target" --all | grep "error:" || true)

сохраняет ответ команды в переменной RESPONSE. Так что это делается в bash для любой конструкции, например VAR=$(command). Если существует ошибка, переменная пуста, но генерирует вывод для пользователя. Если вы добавляете 2>&1, вы говорите то же самое, но если существует ошибка, выводится файл $1, в вашем случае - var $RESPONSE. Вы могли бы сделать это

RESPONSE=$(git push "$target" --all 2>&1 | grep "error:" || true); echo $RESPONSE

Подробнее о замене команд и перенаправлениях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...