2017-02-16 4 views
1

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

Что-то вроде этого: % (echo OK; true) | FILTER % (echo ERROR; false) | FILTER ERROR

Может FILTER быть реализованы с использованием стандартных инструментов оболочки? Структура не обязательно является трубой. Что-то вроде FILTER "my_command" в порядке.

P.S. Фактическая программа - это единичный тест, реализованный с помощью набора Google Test. Это всегда довольно многословно, и в случае успеха результат не интересен.

+0

Будет ли всегда присутствовать суб-оболочка? '()' или просто пример, показанный здесь? – Inian

+0

'a = $ (echo OK; true) || echo "$ a" '; 'a = $ (echo ERROR; false) || echo "$ a" '; – anishsane

+0

@ Инициал, нет - подоболочка - это просто попытка написать ясный пример. – ugoren

ответ

2

Вы DONT нужна подоболочка в вашем случае, как вы можете увидеть ниже, код завершения набора команд (список команд, разделенных символом «;»), является кодом завершения последнего команды в наборе. Таким образом, только true или false в конце имеет значение в ваших примерах. Ни одна из команд до материи.

Лучший способ сделать это было бы использовать командную замену ($()), перехватывать вывод в переменную и использовать оболочку встроенный || оператора, который запускает последующую команду только если код возврата предыдущей команды является сбой.

var=$(echo ERROR); false || printf "%s\n" "$var" 
ERROR 

var=$(echo ERROR); true || printf "%s\n" "$var" 

Обратный приведенной выше статья будет

var=$(echo ERROR); true && printf "%s\n" "$var" 
ERROR 

var=$(echo ERROR); false && printf "%s\n" "$var" 

Посмотрите, что man страницы сказать о для COMMAND LISTS

И и ИЛИ списки последовательность одного из нескольких трубопроводов разделенных операторами управления && и || соответственно. AND и OR списки выполняются с левой ассоциативностью. И список имеет вид

command1 && command2 

command2 выполняется тогда и только тогда, когда command1 возвращает статус выхода ноль. Список, либо имеет вид

command1 || command2 

команда2 выполняется тогда и только тогда, когда команда1 возвращает код завершения ненулевой. Возвращаемым статусом списков AND и OR является статус выхода последней команды, выполненной в списке.

+1

Сохранение неизвестного количества данных в переменной оболочки представляется мне неудобным, но оно работает, а' printf' отлично подходит для строк новой строки (unline 'echo'). – ugoren

+0

Использование '(echo OK; true)' было просто примером - на практике это один исполняемый файл, поэтому я не могу захватить только первую часть. Но исправление легко: 'var = $ (echo OK; true) && printf"% s \ n "" $ var "' работает то же самое – ugoren

3

Вы можете перенаправить стандартный вывод в/DEV/нуль с этим:

command 1>/dev/null 

Таким образом, появляются только сообщения об ошибках.

+0

Это не то, что я прошу. Я хочу, чтобы все результаты были успешными, покажите весь вывод на ошибке. – ugoren

Смежные вопросы