Какой смысл перенаправлять вывод команды grep в / dev / null?


24

Рассмотрим эту строку:

${libdir}/bin/licenseTool check "${SERIAL}" "${VERSION}" "${PRODUCT}" ${libdir} | grep '^200' >/dev/null

Какой смысл искать шаблон в выводе, если результат этого отбрасывается?

И если такая строка появляется как последняя вещь в bash-скрипте, возвращается ли ее значение завершения вызывающей стороне скрипта или игнорируется? (Я размышляю над тем, можем ли мы предположить, что это сделано только для побочных эффектов или как-то возвращает вызывающей стороне.)

Ответы:


29

Ваше подозрение верно; состояние выхода последней команды скрипта будет передано в вызывающую среду. Таким образом, ответ заключается в том, что этот сценарий будет возвращать состояние выхода 0, если grepв данных есть совпадение, существующее состояние 1, если совпадений не было, и состояние выхода 2, если произошла ошибка.


27

Точка grepвывода ping, которая отбрасывается, заключается в том, что автору требуется только возвращаемый статус grep. Он / она только хочет знать, соответствует ли образец или нет. В вашем случае последний grepпроверяет, содержат ли выходные данные предыдущей команды строки, начинающиеся с 200.

В современной системе POSIX вы можете сделать все это с помощью команды grep -q без перенаправления на /dev/null:

... | grep -q '^200'

Примечание, что использование grep -qимеет незначительный побочный эффект, спасибо Стефану Шазеласу за то, что он указал в своем комментарии. grep -qзавершает работу, как только находит первое совпадение, и если licenseToolпосле grepвыхода все еще что-то пишет , он получает SIGPIPE.


2
и grep -qиспользует меньше
ресурсов

5
Поскольку эти вещи идут, grep -qбыл добавлен относительно недавно; многие сценарии все еще используют > /dev/nullвместо этого, потому что это было все, что у вас было в Ледниковый период (то есть, 1995).
Звол

3
В вашем первом предложении отсутствует глагол?
AL

Другая неэквивалентность между «grep -q» и «grep> / dev / null» из справочной страницы GNU: «Однако, если используется -q или --quiet или --silent и выбрана строка, статус выхода будет 0, даже если произошла ошибка. "
Отметить

если документация верна, «состояние выхода равно 0, даже если произошла ошибка» ... я думаю, что -qопция не кажется подходящей ... потому что вы хотите, чтобы она узнала об ошибке, проверив состояние выхода.
Тревор Бойд Смит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.