2011-08-18 25 views
33

No es esta línea en un script de shell que he visto:

grep -e ERROR ${LOG_DIR_PATH}/${LOG_NAME} > /dev/null 
if [ $? -eq 0 ] 
+1

gracias Wyzard y Chris, excelentes respuestas; sin embargo, solo puedo seleccionar una respuesta. >< –

Respuesta

32

Es comprobar el valor de retorno ($?) de grep. En este caso, lo compara con 0 (éxito).

Normalmente, cuando ve algo como esto (verificando el valor de retorno de grep) está comprobando si se detectó una cadena en particular. Aunque la redirección a /dev/null no es necesaria, lo mismo se puede lograr utilizando -q.

+0

Una pregunta, ¿dónde está/dev/null y qué es? ¿Es un archivo? –

+4

'/ dev/null' es un tipo de archivo especial de" agujero negro ". Cuando escribe en él, los datos se descartan. Es una forma clásica de evitar que un programa imprima su salida en la pantalla. –

+0

Para agregar comentarios a @Chris, '/ dev/null' significa" dispositivo nulo ". Cuando pienso en lo que '/ dev/null' es en realidad, no parece una gran opción para un nombre de usuario. –

25

$? es el estado de salida del comando ejecutado más recientemente; por convención, 0 significa éxito y cualquier otra cosa indica fracaso. Esa línea está probando si el comando grep fue exitoso.

Los grep estados página de manual:

El estado de salida es 0 si no se encuentran líneas seleccionadas, y 1 si no lo encuentra. Si se produce un error, el estado de salida es 2. (Nota: el código de manejo de errores POSIX debe verificar '2' o superior.)

Por lo tanto, en este caso se comprueba si se encontraron líneas de ERROR.

+0

+1 por explicar $? –

2

Es una forma extremadamente sobreutilizada de verificar el éxito/falla de un comando. Normalmente, el fragmento de código que se da refactorizado como:.

 
if grep -e ERROR ${LOG_DIR_PATH}/${LOG_NAME} > /dev/null; then 
    ... 
fi 

(Aunque se puede utilizar '-q grep' en algunos casos en lugar de volver a dirigir a/dev/null, al hacerlo, no es portátil Muchas implementaciones de grep no admite la opción -q, por lo que su secuencia de comandos fallará si la usa.)

Cuestiones relacionadas