Intereting Posts
Bluetooth BNEP занимает много времени, чтобы загрузить загрузку Debian Случайное удаление каталога / lib в Fedora 15 KVM сообщает о странных пиках использования ЦП (бесконечная рекурсия bash) Эквивалент Telnet для USB-устройств? Как управлять несколькими макетами панелей для разных настроек дисплея в KDE? Bash: Echo переменная, имя которой является значением другой переменной Каково определение шрифта, используемого для консоли Solaris в текстовом режиме? Почему «чужой адрес» не IP-адрес, а что-то вроде этого? Вывод содержимого конвейера в файл и отображение количества строк в файле на stdout Как проверить загрузку FreeBSD iso? Пакеты установщика: .bin, -rpm.bin, tar, tar.z Получить исполняемый файл для любой команды Несколько shebangs в одном файле bash sed: вставьте sth перед последующими строками, которые начинаются одинаково, но не совпадают Запустить приложение «motion» для Linux в качестве пользователя

Как извлечь из тройника?

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

command | tee >(grep rerun) command | grep rerun 

Первый выводит весь вывод, как и ожидалось, но я не могу использовать его как условие, потому что он всегда возвращает 0. Второй выводит только строки, содержащие повторный запуск, но возвращает 1, если совпадения нет.

Мой пример использования:

 while pdflatex paper.tex | grep -E "rerun LaTeX|run Biber"; do biber paper done 

Приведенные здесь ответы также не помогают, потому что там grep всегда возвращает 0.

Просто используйте

 command | tee outfile | grep rerun 

или же

 while pdflatex paper.tex | tee outfile | grep -E "rerun LaTeX|run Biber"; do 

Вы можете проверить состояние команды grep, а затем посмотреть файл «output».

Вы можете открыть файл и выполнить grep для файла. Затем вы можете использовать код выхода grep (0, если есть совпадение):

 RERUN=1 while [[ $RERUN == 1 ]] ; do biber paper ! pdflatex paper.tex | tee output.txt && grep -E -q "rerun LaTeX|run Biber" output.txt RERUN=$? done 

! в 4-й строке инвертирует код выхода процесса grep, потому что grep возвращает 0, когда находит совпадение, и 1, если нет совпадения, см. справочную страницу grep :

СТАТУС ВЫХОДА

  Normally the exit status is 0 if a line is selected, 1 if no lines were selected, and 2 if an error occurred. However, if the -q or --quiet or --silent is used and a line is selected, the exit status is 0 even if an error occurred. 

5-я строка помещает последний код выхода ( $? ) В переменную RERUN, которая используется в условии цикла.

Я также добавил опцию -q в grep, чтобы не писать в stdout

Если мы сразу начнем отображать стандартный stdout то вывод grep в Process Substitution должен быть перенаправлен в файл, чтобы вы не получили дублированные строки в выводе, поэтому вы должны сделать, например, следующее: command | tee >(grep rerun >/tmp/my.log) command | tee >(grep rerun >/tmp/my.log) .

После создания файла все, что вам нужно сделать, это использовать [[ -s /tmp/my.log ]] качестве условия повторного [[ -s /tmp/my.log ]] .