
Síntesis
-
Cada comando Linux devuelve un código de salida, con 0 que indica el éxito y los títulos distintos de cero que indican equivocación.
-
¿Puedes usar el $? Variable para ingresar al código de salida y al flujo del software de control en los scripts.
-
Tenga cuidado con los códigos de salida no convencionales que varían entre los comandos, como la diff y el rizo.
Cada comando de Linux imprimirá mensajes de error si equivocación, pero esta información es difícil de echarse en brazos. Sus scripts deben utilizar los códigos de salida para ser lo más robustos posible.
¿Qué son los códigos de salida?
Cuando ejecuta un comando Linux, puede equivocarse. Las cosas pueden salir mal por varias razones, pero generalmente verá un mensaje explicando por qué:
El mensaje de error que ve aparece en Stderr, una transmisión diferente de StDout, que le permite aislar errores de la salida esperada. Como heredero, una descripción del error debe ser informativo, pero los scripts y otros procesos automatizados deben enterarse sobre los errores de forma más confiable.

Relacionado
¿Qué son Stdin, Stdout y Stderr en Linux?
Mistificado por Stdin, Stdout y Stderr? Aprenda a usarlos en sus scripts de Linux.
Adyacente con los mensajes de error legibles, cada comando asimismo devuelve un código de salida. Este es un número entre 0 y 255 que indica si el comando falló o tuvo éxito. Por defecto, el COE de salida está oculto, pero su shell proporciona golpe a este valía en la variable distinto, ¿$?
Tenga en cuenta que un valía 0 indica éxito y un valía diferente de cero significa equivocación. Puede realizar este valía en la ristra de comando, interrogarlo en un script y usarlo para controlar el flujo de sus programas.
¿Cómo uso los códigos de salida?
En el ejemplo precedente, LS devolvió un código de salida 0 cuando tuvo éxito y un 1 cuando su argumento no era un archivo válido. Esto puede parecer contradictorio, y contradice los lenguajes de programación típicos que tratan a 0 como un valía espurio y 1 como serio. Sin bloqueo, esta configuración permite un único valía de éxito universal y un amplio rango de títulos para representar diferentes tipos de error.
Así como hacer eco de los $? Variable Para realizar manualmente el estado de salida, puede usarlo con una instrucción IF condicional. Si el comando devuelve un estado de salida 0, la confesión ejecutará el retiro asociado. De lo contrario, si hay uno, ejecutará el sillar de lo otro. Por ejemplo:
if command; then echo "command succeeded"; else echo "command failed"; fi
Puede usar esta construcción en un script de shell, donde es un poco más tratable formatear para la legibilidad:
if command
then echo "command succeeded"
else echo "command failed"
fi
Este es el equivalente de:
commandif ( $? -eq 0 )
then echo "command succeeded"
else echo "command failed"
fi
La interpretación más larga utiliza la sintaxis de Bracket Square para probar el valía de $?, Pero generalmente es más tratable probar el valía directamente, como en el primer caso. ¿Recuerdas eso $? Siempre representa el código de salida del postrero comando, así que tenga cuidado. ¿Puede tener la tentación de crear el valía de $? para la depuración, por ejemplo
commandecho "command returned exit code:" $?
if ( $? -eq 0 )
then echo "command succeeded"
else echo "command failed"
fi
Pero, en el punto del cheque de condición, ¿$? tendrá el valía del estado de salida de Echo, que casi se garantiza que es 0. Para evitar esto, pruebe el comando directamente en condicional o almacene el valía de $? en una variable.

Relacionado
Cómo usar las declaraciones BASH IF (con 4 ejemplos)
La confesión IF es la forma más tratable de explorar la ejecución condicional en los scripts bash.
¿Qué más hay que enterarse sobre el estado de salida?
Los códigos de salida son asaz simples, siguiendo el principio de Unix, y esto es parte de su poder. Pero hay algunos gotchas y casos excepcionales que debe tener en cuenta.
Códigos de salida de su caparazón
Su shell usará códigos de salida incluso cuando el comando que escriba no se ejecuta correctamente. Por ejemplo, ZSH y BASH usan 127 si no se encuentra el comando y 126 si el comando no es ejecutable:
Códigos de salida no convencionales
Algunos comandos doblan sutilmente las reglas del estado de salida; En verdad son solo convenciones, de todos modos. Por ejemplo, DIFF utiliza un valía de 0 para significar “sin diferencias”, un valía de 1 para significar “diferencias” y un valía de 2 para representar un error:
Esto puede confundir el significado de los condicionales; Por ejemplo:
if diff file1 file2; then
echo these files are the same!
fi
El comando curl asimismo es un poco poco intuitivo. Puede esperar que CURL noticia un error HTTP, como un 404 para una URL inexistente, como un código de estado diferente de cero, pero no lo hace:
Puede usar la opción -f (-fail) para hacer que Curl se comporte de forma diferente, devolviendo un código de salida de 22 en la equivocación:
Sin bloqueo, tenga en cuenta que esto no está resguardado al 100% y algunos errores HTTP, incluidos los que requieren autenticación, aún devolverán un código de salida 0.
Usando el estado de salida en una sujeción de comando
Uno de los mejores atajos de estado de salida ocurre sin que incluso necesite pensar en ello. Aquí hay un ejemplo simple:
ls program && ./program && echo success || echo epic fail
El && y || Los operadores lógicos le permiten ejecutar más de un comando basado en el estado de salida de otros. Son similares a los operadores correspondientes en la mayoría de los lenguajes de programación, pero respetan la convención del código de salida. El cámara && ejecutará el comando a su derecha solo si el comando a su izquierda devuelve un estado de salida 0. El || El cámara ejecutará el comando a su derecha solo si el comando a su izquierda equivocación con un estado diferente de cero.
Se produce un caso muy popular cuando construye software desde cero, utilizando esta prescripción:
./configure && make && make install
Las tres partes de este comando hacen lo posterior:
-
./Configure ejecuta un script circunscrito que inspecciona su entorno y genera un archivo de make.
-
Make Ejecutar el software Make y construye el software, utilizando MakeFile.
-
Haga que la instalación de copias sea ejecutable generado a una ubicación aceptablemente conocida como/usr/circunscrito/bin.
Si alguna parte de este proceso equivocación, se detendrá inmediatamente sin intentar el resto.
Los comandos verdaderos y falsos
Su sistema Linux incluye dos comandos curiosos: Definitivo y Infiel. Cada uno de estos no hace falta, excepto para devolver un código de salida apropiado: 0 y 1 respectivamente:
Puede que no parezcan muy efectos, pero estos comandos son efectos para las pruebas y para algunas tareas de secuencias de comandos. Puede usar serio en una confesión de tiempo para crear un onda infinito:
while true
do
echo “running until you ^c”
sleep 10
done
Igualmente puede usarlos cercano con operadores lógicos para alterar el comportamiento del comando. Por ejemplo, puede evitar que se ejecute una sujeción de comando larga:
false && (none || of-these && commands || will-run)
O puede presionar a una sujeción de comando a continuar ejecutándose, incluso si un comando equivocación:
cat file-that-may-not-exist | true && echo done
Devolver un código de salida de sus propios scripts
Probablemente haya usado el comando de salida ayer, para dejar su terminal. Técnicamente, renuncia a su caparazón y esto significa que asimismo puede usarlo para detener un script de shell. Por defecto, sus scripts saldrán con el mismo código que el postrero comando:
Pero puede cambiar el código de salida pasando un parámetro aritmético al comando de salida:
exit number
Su script ahora saldrá con el código de estado que suministró, y puede usarlo para comunicar diferentes condiciones de error de su software a otros.
Una vez que sepa sobre ellos, los comandos de salida son fáciles de usar. Incluso puede usarlos sin pensar en realidad en ello, pero cuando se comercio de secuencias de comandos, asegúrese de usar los códigos de salida adecuadamente.