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

Мне нужно бежать cmd1, Если и только если PATTERN отсутствует в его STDOUT, мне нужно запустить cmd2 тоже:

cmd1 | grep "$PATTERN"  ||  cmd2

Но я хотел бы видеть все выходные данные из cmd1, а не только строки, которые соответствуют PATTERN.

Я знаю, что мог бы сделать что-то вроде этого:

OUTPUT=`cmd1`
echo "$OUTPUT"
echo "$OUTPUT" | grep -q "$PATTERN"  ||  cmd2

но это отделит STDOUT от STDERR. Кроме того, я бы предпочел иметь удобный однострочник. Поэтому я ищу параметр в grep или альтернативу grep, который говорит: "Не фильтруйте, просто установите код выхода".

1 ответ

Решение

Как насчет использования tee отправить вывод на tty так:

cmd1 | tee /dev/tty | grep "$PATTERN"  ||  cmd2

Пример с PATTERN согласование cmd1выход:

% echo "cmd1 output" | tee /dev/tty | grep -q "output" || echo "nothing matches PATTERN"
cmd1 output

Пример с PATTERN не соответствует cmd1выход:

% echo "cmd1 output" | tee /dev/tty | grep -q "outputttt" || echo "nothing matches PATTERN"
cmd1 output
nothing matches PATTERN
Другие вопросы по тегам