lamo4ok
@lamo4ok
Программист

Как при выполнении команды bash, которая использует grep, получить код выхода команды, а не самого grep?

Суть вопроса сформулирована достаточно сумбурно, поясню на примере. Есть примерно такая команда:

git diff --diff-filter=AM --name-only origin/master | grep app/ > ./log

Проблема в том, что сам grep, в случае, если не находит переданную строку (/app), возвращает код 1. Соответственно, используя команду выше, мы вынуждены подавлять его вывод об ошибках примерно так:

git diff --diff-filter=AM --name-only origin/master | grep app/ > ./log || true

Но тут возникает другая проблема. Если например первая часть команды (git diff --diff-filter=AM --name-only origin/master) захочет вернуть какую-либо ошибку, мы подавляем и ее тоже. Пробовал первое, что пришло в голову:

git diff --diff-filter=AM --name-only origin/master | (grep app/ > ./log || true)

и даже так:

git diff --diff-filter=AM --name-only origin/master | (grep app/ || true) > ./log

но ошибка первой команды все равно подавляется. Подскажите, как переписать команду так, чтобы в случае, если первая ее часть выводила ошибку, вызов команды целиком падал с той же ошибкой, а если ошибку выводил grep (1 – строки не найдены), то это подавлялось.
  • Вопрос задан
  • 144 просмотра
Решения вопроса 1
ky0
@ky0
Миллиардер, филантроп, патологический лгун
Пригласить эксперта
Ответы на вопрос 1
saboteur_kiev
@saboteur_kiev Куратор тега bash
software engineer
Храни результат diff в промежуточном значении
result="git diff --diff-filter=AM --name-only origin/master"
grep "app/" <"$result" > ./log

соответственно каждую команду можешь отдельно почекать
result="git diff --diff-filter=AM --name-only origin/master"
if [ $? -eq 0 ]; then echo OK; else echo NOT OK; fi
grep "app/" <"$result" > ./log
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы