¿Qué sentido tiene redirigir la salida de grep a / dev / null?

24

Considere esta línea:

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

Cuál es el punto de buscar el patrón en la salida si el resultado de que se tira?

Y, si una línea como esa aparece como la última cosa en un script bash, ¿su valor de salida se devuelve al llamante del script o se ignora? (Estoy especulando si podemos suponer que esto se hace solo para efectos secundarios o de alguna manera devuelve algo a la persona que llama).

JDługosz
fuente

Respuestas:

29

Tu sospecha es correcta; el estado de salida del último comando del script se pasará al entorno de llamada. Entonces, la respuesta es que este script devolverá un estado de salida 0 si grepcoincide con algo en los datos, existirá el estado 1 si no hubo coincidencia y el estado de salida 2 si ocurrió algún error.

Janis
fuente
27

El punto de grepsalida de ping que se descarta es que el escritor solo quiere el estado de retorno de grep. Él / Ella solo quiere saber si un patrón coincide o no. En su caso, el último grepverifica si la salida del comando anterior contiene líneas que comienzan con 200.

En el sistema POSIX moderno, puede hacerlo todo con grep -q sin redirigir a /dev/null:

... | grep -q '^200'

Una nota de que el uso grep -qtiene un efecto secundario menor, gracias Stéphane Chazelas por señalar en su comentario. grep -qsale tan pronto como encuentra la primera coincidencia, si licenseToolaún escribe algo después de grepsalir, recibirá un SIGPIPE.

Cuonglm
fuente
2
y grep -qusa menos CPU
Skaperen
55
Como van estas cosas, grep -qse agregó relativamente recientemente; todavía se usan muchos scripts > /dev/nullporque eso era todo lo que tenía en la Era del Hielo (es decir, 1995).
zwol
3
¿Tu primera oración carece de un verbo?
AL
Otra desequivalencia entre "grep -q" y "grep> / dev / null", de la página de manual de GNU: "Sin embargo, si se usa -q o --quiet o --silent y se selecciona una línea, el estado de salida es 0 incluso si ocurrió un error ".
Mark
si la documentación es correcta "el estado de salida es 0 incluso si se produjo un error" ... Creo que la -qopción no parece apropiada ... porque desea que sepa sobre el error comprobando el estado de salida.
Trevor Boyd Smith