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

24

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

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

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

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

JDługosz
источник

Ответы:

29

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

Janis
источник
27

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

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

... | grep -q '^200'

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

cuonglm
источник
2
и grep -qиспользует меньше
ресурсов
5
Поскольку эти вещи идут, grep -qбыл добавлен относительно недавно; многие сценарии все еще используют > /dev/nullвместо этого, потому что это было все, что у вас было в Ледниковый период (то есть, 1995).
Звол
3
В вашем первом предложении отсутствует глагол?
AL
Другая неэквивалентность между «grep -q» и «grep> / dev / null» из справочной страницы GNU: «Однако, если используется -q или --quiet или --silent и выбрана строка, статус выхода будет 0, даже если произошла ошибка. "
Отметить
если документация верна, «состояние выхода равно 0, даже если произошла ошибка» ... я думаю, что -qопция не кажется подходящей ... потому что вы хотите, чтобы она узнала об ошибке, проверив состояние выхода.
Тревор Бойд Смит