Одним из решений является использование 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), но если по какой-то причине непоследовательная структура команд кажется вам лучше, это способ сделать это.