Quel est l'intérêt de rediriger la sortie de grep vers / dev / null?

24

Considérez cette ligne:

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

Quel est le point de chercher le modèle dans la sortie si le résultat de c'est jeté?

Et, si une ligne comme celle-ci apparaît comme la dernière chose dans un script bash, sa valeur de sortie est-elle retournée à l'appelant du script, ou ignorée? (Je spécule sur le fait que nous pouvons supposer que cela est fait pour les effets secondaires uniquement ou renvoyer quelque chose à l'appelant d'une manière ou d'une autre.)

JDługosz
la source

Réponses:

29

Votre suspicion est correcte; l'état de sortie de la dernière commande du script sera transmis à l'environnement appelant. Donc, la réponse est que ce script renverra un état de sortie 0 s'il grepcorrespond à quelque chose dans les données, existe l'état 1 s'il n'y a pas de correspondance et quitte l'état 2 si une erreur s'est produite.

Janis
la source
27

Le point de grepsortie ping envoyé est que l'écrivain ne veut que l'état de retour de grep. Il / Elle veut seulement savoir si un motif correspond ou non. Dans votre cas, le dernier grepvérifie si la sortie de la commande précédente contient des lignes commençant par 200.

Dans le système POSIX moderne, vous pouvez tout faire avec grep -q sans rediriger vers /dev/null:

... | grep -q '^200'

A noter que l'utilisation grep -qa un effet secondaire mineur, merci Stéphane Chazelas de l' avoir souligné dans son commentaire. grep -qquitte dès qu'il trouve la première correspondance, s'il licenseToolécrit encore quelque chose après sa grepsortie, il recevra un SIGPIPE.

cuonglm
la source
2
et grep -qutilise moins de CPU
Skaperen
5
Comme ces choses vont, a grep -qété ajouté relativement récemment; beaucoup de scripts utilisent toujours à la > /dev/nullplace parce que c'était tout ce que vous aviez à l'époque de la glace (c'est-à-dire 1995).
zwol
3
Votre première phrase manque-t-elle de verbe?
AL
Une autre déséquivalence entre "grep -q" et "grep> / dev / null", de la page de manuel GNU: "Cependant, si -q ou --quiet ou --silent est utilisé et qu'une ligne est sélectionnée, l'état de sortie est 0 même en cas d'erreur. "
Mark
si la documentation est correcte "l'état de sortie est 0 même si une erreur s'est produite" ... Je pense que l' -qoption ne semble pas appropriée ... parce que vous voulez qu'elle connaisse l'erreur en vérifiant l'état de sortie.
Trevor Boyd Smith