Po co przekierowywać wyjście grep do / dev / null?

24

Rozważ tę linię:

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

Jaki jest sens szukać wzoru na wyjściu jeśli wynik , który jest wyrzucany?

A jeśli taka linia pojawia się jako ostatnia rzecz w skrypcie bash, to czy jej wartość wyjściowa jest zwracana do programu wywołującego skrypt, czy ignorowana? (Zastanawiam się, czy możemy założyć, że dzieje się tak tylko w przypadku efektów ubocznych, czy w jakiś sposób zwraca coś dzwoniącemu.)

JDługosz
źródło

Odpowiedzi:

29

Twoje podejrzenie jest słuszne; status wyjścia ostatniego polecenia skryptu zostanie przekazany do środowiska wywołującego. Więc odpowiedź jest taka, że ​​ten skrypt zwróci status wyjścia 0, jeśli coś greppasuje do danych, istnieje status 1, jeśli nie było dopasowania, i status wyjścia 2, jeśli wystąpił jakiś błąd.

Janis
źródło
27

Punktem grepwyjściowym polecenia ping, który jest wyrzucany, jest to, że pisarz chce tylko status powrotu grep. On / Ona chce tylko wiedzieć, czy wzór pasuje, czy nie. W twoim przypadku ostatnie grepsprawdzenie, czy wynik wcześniejszego polecenia zawiera jakieś wiersze, zaczyna się od 200.

W nowoczesnym systemie POSIX możesz to zrobić za pomocą grep -q bez przekierowywania do /dev/null:

... | grep -q '^200'

Uwaga, że ​​używanie grep -qma niewielki efekt uboczny, dziękuję Stéphane Chazelas za wskazanie w jego komentarzu. grep -qkończy się, gdy tylko znajdzie pierwsze dopasowanie, jeśli licenseToolnadal coś napisze po grepwyjściu, otrzyma SIGPIPE.

Cuonglm
źródło
2
i grep -qzużywa mniej procesora
Skaperen
5
W miarę upływu czasu grep -qdodano go stosunkowo niedawno; > /dev/nullzamiast tego używa się wielu skryptów, ponieważ to było wszystko, co miałeś w epoce lodowcowej (czyli 1995).
zwolnij
3
Czy w twoim pierwszym zdaniu brakuje czasownika?
AL
Kolejna nierównowaga między „grep -q” i „grep> / dev / null”, ze strony GNU: „Jednak jeśli użyje się -q lub --quiet lub --silent i zostanie wybrana linia, to kodem wyjścia jest 0, nawet jeśli wystąpił błąd. ”
Mark
jeśli dokumentacja jest poprawna „stan wyjścia wynosi 0, nawet jeśli wystąpił błąd” ... myślę, że -qopcja nie wydaje się odpowiednia ... ponieważ chcesz, aby wiedział o błędzie poprzez sprawdzenie statusu wyjścia.
Trevor Boyd Smith