Qual è il punto nel reindirizzare l'output di grep su / dev / null?


24

Considera questa riga:

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

Qual è lo scopo di cercare il modello nell'output se il risultato di questo viene eliminato?

E, se una riga del genere appare come l'ultima cosa in uno script bash, il suo valore di uscita viene restituito al chiamante dello script o ignorato? (Sto ipotizzando se possiamo supporre che ciò avvenga solo per gli effetti collaterali o che restituisca qualcosa al chiamante in qualche modo.)

Risposte:


29

Il tuo sospetto è corretto; lo stato di uscita dell'ultimo comando dello script verrà passato all'ambiente chiamante. Quindi la risposta è che questo script restituirà uno stato di uscita 0 se grepcorrisponde a qualcosa nei dati, esiste lo stato 1 in assenza di corrispondenza e lo stato di uscita 2 se si è verificato un errore.


27

Il punto di grepuscita del ping che viene eliminato è che lo scrittore desidera solo lo stato di ritorno di grep. Vuole solo sapere se un modello corrisponde o no. Nel tuo caso, l'ultimo grepcontrolla se l'output del comando precedente contiene delle righe che iniziano con 200.

Nel moderno sistema POSIX, puoi fare tutto con grep -q senza reindirizzare a /dev/null:

... | grep -q '^200'

Una nota che l'uso grep -qha un effetto collaterale minore, grazie a Stéphane Chazelas per aver sottolineato nel suo commento. grep -qesce non appena trova la prima corrispondenza, se licenseToolscrive ancora qualcosa dopo essere grepuscito, riceverà un SIGPIPE.


2
e grep -qutilizza meno CPU
Skaperen il

5
Mentre vanno queste cose, è grep -qstato aggiunto relativamente di recente; molti script > /dev/nullinvece usano ancora perché era tutto ciò che avevi di nuovo nell'era glaciale (cioè 1995).
zwol,

3
La tua prima frase manca di un verbo?
AL

Un'altra disequivalenza tra "grep -q" e "grep> / dev / null", dalla manpage GNU: "Tuttavia, se si utilizza -q o --quiet o --silent e si seleziona una linea, lo stato di uscita è 0 anche se si è verificato un errore. "
Segna il

se la documentazione è corretta "lo stato di uscita è 0 anche se si è verificato un errore" ... Penso che l' -qopzione non sembri appropriata ... perché vuoi che sappia dell'errore verificando lo stato di uscita.
Trevor Boyd Smith,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.