2011-08-07 14 views

Respuesta

48

Depende del comando diff. Mina (GNU Diffutils 3.0) dice:

un estado de salida 0 significa que no se encontraron diferencias, 1 significa que se encontraron algunas diferencias y 2 significa problemas. Normalmente, los diferentes archivos binarios cuentan como problema, pero esto puede alterarse utilizando la opción -a o --text, o la opción -q o --brief.

+4

de acuerdo, he comprobado las fuentes, y los únicos códigos de salida son EXIT_SUCCESS, EXIT_FAILURE (ambos definidos en stdlib.h) y EXIT_TROUBLE , definido en src/diffutils-3.0/system.h –

+0

La opción '--text' hace un lío de mi STDOUT si hay dos (grandes) archivos binarios diferentes. –

+0

Estoy usando diffutils de GNU también, pero he citado la página de manual incorrecta. –

6

Puede haber, o no puede haber diferentes códigos de error dependiendo de la versión de diff que utilice. Si mal no recuerdo, el estándar BSD diff siempre devolvió un código de salida de 0, 1 o 2.

Sin embargo, la página de manual no está trazando todo lo que diff podría hacer, pero la documentación que puede usar para usar diff mando. En un script de shell, quiero saber si los archivos coinciden (exit = 0) o no coinciden (exit = 1). Sin embargo, en mi script de shell, también quiero saber que el comando diff no funcionó.

diff $file1 file2 > /dev/null 2>&1 
error=$? 
if [ $error -eq 0 ] 
then 
    echo "$file1 and $file2 are the same file" 
elif [ $error -eq 1 ] 
    echo "$file1 and $file2 differ" 
else 
    echo "There was something wrong with the diff command" 
fi 

Imagínese si me dijeron que significaba el diff 2 mandato ha fallado, pero una versión más reciente del comando diff hizo una distinción entre un archivo no se puede leer (salida = 2) y un archivo que falta (salida = 3). Ahora bien, imagínese si lo hiciera lo siguiente en una versión anterior del comando diff, pero $file2 no existía:

diff $file1 file2 > /dev/null 2>&1 
error=$? 
if [ $error -eq 2 ] 
then 
    echo "There was something wrong with the diff command" 
elif [ $error -eq 1 ] 
    echo "$file1 and $file2 differ" 
else 
    echo "$file1 and $file2 are the same file" 
fi 

En el código anterior, he comprobado el código de error de 2 y 1, pero no 3 Entonces, en lugar de detectar un archivo perdido, supongo que los archivos coinciden.

La página de manual intenta asegurarse de que las futuras actualizaciones del sistema operativo no provoquen que la mayoría de las secuencias de comandos de shell fallen repentinamente. Es por eso que hubo un comando awk y nawk separado y un comando grep y egrep por separado.

* Actualizado según el comentario de @chus.

+3

Tenga cuidado: '$?' Se actualiza después de ejecutar 'if [$? eq 0] ', por lo que la evaluación' elif' no está relacionada con la salida de diff. – chus

+1

"No [puede haber o no] diferentes códigos de error según la versión de' diff 'que use. " [POSIX 'diff' sale con 0 cuando los archivos son idénticos, 1 cuando difieren, y> 1 de lo contrario] (http://pubs.opengroup.org/onlinepubs/009696799/utilities/diff.html). Entonces no puedes asumir 2, pero 0 y 1 son seguros. –

+0

@chus Tienes razón. Actualizaré mi respuesta. –

3

En mi caso diff regresaron 127, buscado por ella y lo encuentran en el tldp.org "Códigos de salida con significados especiales"

127 "comando no encontrado" illegal_command posible problema con $ PATH o un error tipográfico.

Utilicé una ruta de acceso a la diferencia incorrecta. :)

Fuente: tldp.org/LDP/abs/html/exitcodes.html

Cuestiones relacionadas