Рейтинг:5

Как проверить, не сработала ли команда... с помощью канала?

флаг cn

Итак, у меня есть такой скрипт:

какая-токоманда | grep --invert-сопоставить что-то

Я хотел бы иметь возможность условно запускать другую команду, если какая-то команда терпит неудачу. Вот что я пробовал:

какая-то команда | grep --invert-сопоставить что-то || {
    эхо "Ой"
}

Но это не сработало (т. grep не был казнен). Каков правильный способ сделать это?

флаг hr
Возможно, вы можете использовать массив `PIPESTATUS` bash: см., например, [Получить статус выхода процесса, который передается другому] (https://unix.stackexchange.com/a/14276/65304)
флаг be
Когда вы используете канал, `grep` запускается *до*, когда вы обязательно узнаете, не удалось выполнить `somecommand` или нет. Вы хотите, чтобы вывод другой команды также попадал в `grep`? `{ какая-то команда || { эхо К сожалению; }; } | грэп...`.
Рейтинг:10
флаг cn

@steeldriver упоминается в комментариях что ПИПЕСТАТУС может работать. Я попробовал это, и это сработало хорошо. Вот что я сделал:

какая-то команда | grep --invert-сопоставить что-то
если [ "${PIPESTATUS[0]}" != "0" ]; тогда
    эхо "Ой"
фи

Он выполняет команду, как и раньше, но затем у меня есть если заявление, чтобы посмотреть на ПИПЕСТАТУС множество. Меня волнует только первый элемент, поэтому я смотрю именно на него. Я проверяю, что это не удалось (если код выхода не 0), и если это не удалось, запустите эхо "Ой"

флаг in
Это работает независимо от `set -o pipefail`?
cocomac avatar
флаг cn
@PedroA Я не знаю, что это делает. Если вы попробуете это, не стесняйтесь редактировать мой ответ или опубликовать свой собственный.
eckes avatar
флаг cn
Да, он работает с pipefail, но не с `set -e -o pipefail`, так как он не достигает if.
Рейтинг:7
флаг us

Другой способ, в зависимости от точного требуемого поведения, заключается в использовании в сбой трубы вариант:

Статус выхода конвейера — это статус выхода последней команды. в трубопроводе, если только сбой трубы опция включена (см. Набор Встроенный). Если сбой трубы включен, статус возврата конвейера — это значение последняя (крайняя справа) команда для выхода с ненулевым статусом или нулевым если все команды завершатся успешно.

Итак, если вам все равно, какой из какая-то команда или же grep потерпел неудачу, пока один из них не потерпел неудачу:

установить -o pipefail
если ! какая-то команда | grep --invert-сопоставить что-то; тогда
    эхо "Ой"
фи

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.