Как определить, присутствует ли строка в stdout, не влияя на вывод?

У меня есть программа my_program которая выводит диагностическое сообщение на стандартный вывод

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

Ближайший ответ, который я нашел,

 if [ !my_program | grep "TEST FAILURE" ] then some_cmd fi 

Однако этот метод отключит все диагностические сообщения. Я все еще хочу, чтобы сообщения отображались на stdout. Некоторые предлагают сначала запустить программу без использования grep , затем запустить программу во второй раз и выполнить конвейер с grep , однако моей программе требуется 1 час, я хочу избежать запуска большой программы дважды.

Какие-нибудь мысли?

2 Solutions collect form web for “Как определить, присутствует ли строка в stdout, не влияя на вывод?”

Вы можете использовать tee для отправки вывода команды как на grep и на ваш терминал ( /dev/tty ):

 # Note grep's stdout is redirected to /dev/null # because we only care about its exit code if echo foo | tee /dev/tty | grep foo > /dev/null; then echo OK fi 

Из структуры каталогов и устройств POSIX:

/dev/tty

В каждом процессе – синоним управляющего терминала, связанного с группой процессов этого процесса, если таковой имеется. Это полезно для программ или процедур оболочки, которые хотят быть уверенными в записи сообщений или чтении данных с терминала, независимо от того, как перенаправлен вывод. Он также может использоваться для приложений, которые требуют имя файла для вывода, когда требуется типизированный вывод, и утомительно выяснять, какой терминал используется в настоящее время.

Это не поможет, если вы хотите, чтобы вывод команды был перенаправлен на стандартный вывод скрипта, который может не быть терминалом.

Вы можете сохранить вывод команды для дальнейшей обработки, хотя:

 # Save output in a variable (or a regular file, a named pipe, etc.) output="$(echo foo)" # Dump output to script's stdout cat < << "${output}" # Check if output matches some pattern if grep foo <<< "${output}" > /dev/null; then echo OK fi 

Использование цикла в bash также может решить вашу проблему:

 #!/bin/bash flagfile=/tmp/flagfile.$$.something my_program | while read line ; do if echo "$line" | grep "TEST FAILURE" then touch $flagfile else echo "$line" fi done if [ -f $flagfile ] ; then rm -f $flagfile some_cmd fi - #!/bin/bash flagfile=/tmp/flagfile.$$.something my_program | while read line ; do if echo "$line" | grep "TEST FAILURE" then touch $flagfile else echo "$line" fi done if [ -f $flagfile ] ; then rm -f $flagfile some_cmd fi 

Обратите внимание, что вы не можете использовать переменную flag, поскольку цикл while будет выполняться в подоболочке.

  • Команда для вывода содержимого файла в stdout?
  • grep ключевое слово из вывода Mplayer и отправить остальное в файл
  • Какова была первоначальная (-ые) причина (-ы) добавления «стандартной ошибки», которая отделена от «стандартного вывода»?
  • Предполагаемое поведение stdbuf для подпроцессов
  • Обертка скрипта оболочки с тройником
  • IO и другие команды оболочки, когда программа не запускается терминалом
  • Использование трубы STDOUT в качестве переменной?
  • Перенаправление tr stdout в файл
  • Подавлять сообщения о запуске на stdout?
  • Записать исходный файл Python в файл немедленно
  • Как использовать аргументы имени файла или по умолчанию для stdin, stdout (краткое)
  • Interesting Posts

    Что может привести к тому, что не показывать что-то в пути?

    Почему «ls -L» печатает имя самой ссылки, а не имя файла, на который указывает ссылка?

    Почему эта команда find не возвращает имена файлов, содержащие только символы, отличные от ASCII?

    Как остановить sudo PAM-сообщения в auth.log для конкретного пользователя?

    Перемещение кнопок мыши в tmux

    mount: неправильный тип fs, плохая опция, плохой суперблок

    Создание глобальной функции в OS X

    запуск программы, расположенной на моем компьютере на сервере

    Debian Lenny, какой почтовый сервер настроить?

    Можно ли обменяться безопасностью во время спячки?

    FreeBSD Clonezilla не восстанавливает

    Ошибка сегментации в системном каталоге `/ tmp`

    Получение ошибок Python всякий раз, когда я пытаюсь использовать терминал в Linux Mint

    Linux Mint застрял в режиме самолета

    Может ли несколько пользователей одновременно выполнять команды, используя tmate с отдельными курсорами в одном сеансе?

    Linux и Unix - лучшая ОС в мире.