Qual é o sentido de redirecionar a saída do grep para / dev / null?

24

Considere esta linha:

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

Qual é o sentido de procurar o padrão na saída se o resultado disso for descartado?

E, se uma linha como essa aparecer como a última coisa em um script bash, seu valor de saída retornará ao chamador do script ou será ignorado? (Estou especulando se podemos assumir que isso é feito apenas para efeitos colaterais ou devolver algo ao chamador de alguma forma.)

JDługosz
fonte

Respostas:

29

Sua suspeita está correta; o status de saída do último comando do script será passado para o ambiente de chamada. Portanto, a resposta é que esse script retornará um status de saída 0 se grepcorresponder a algo nos dados, existir o status 1 se não houver correspondência e sair o status 2 se ocorrer algum erro.

Janis
fonte
27

O ponto de grepsaída do ping que é descartado é que o gravador deseja apenas o status de retorno de grep. Ele / ela quer apenas saber se um padrão corresponde ou não. No seu caso, a última grepverifica se a saída do comando anterior contém alguma linha 200.

No sistema POSIX moderno, você pode fazer tudo isso com grep -q sem redirecionar para /dev/null:

... | grep -q '^200'

Uma observação de que o uso grep -qtem um efeito colateral menor, agradece a Stéphane Chazelas por apontar em seu comentário. grep -qsai assim que encontrar a primeira correspondência, se licenseToolainda gravar algo depois de grepsair, receberá um SIGPIPE.

cuonglm
fonte
2
e grep -qusa menos CPU
Skaperen
5
Como essas coisas acontecem, grep -qfoi adicionado relativamente recentemente; muitos scripts ainda usam, > /dev/nullporque era tudo o que você tinha na Era do Gelo (ou seja, 1995).
Zwol 23/04
3
Sua primeira frase não possui verbo?
AL
Outra desigualdade entre "grep -q" e "grep> / dev / null", da página do GNU: "No entanto, se o -q ou --quiet ou --silent for usado e uma linha for selecionada, o status de saída será 0 mesmo que tenha ocorrido um erro. "
Mark
se a documentação estiver correta "o status de saída é 0, mesmo que tenha ocorrido um erro" ... acho que a -qopção não parece apropriada ... porque você deseja que ele saiba sobre o erro verificando o status de saída.
Trevor Boyd Smith