¿Cuál es el significado de $? en un script de shell?

Respuestas:

26

La respuesta de Cjm es correcta, pero $?se puede usar de manera tonta en los scripts de shell, y me gustaría advertir contra eso. Muchos scripts de shell incorrectos tienen un patrón repetido de código:

run_some_command
EXIT_STATUS=$?

if [ "$EXIT_STATUS" -eq "0" ]
then
    # Do work when command exists on success
else
    # Do work for when command has a failure exit
fi

Si es posible (las cuestiones de legibilidad a veces se entrometen), debe codificar esta situación de manera diferente:

if run_some_command
then
    # Do work when command exists on success
else
    # Do failure exit work
fi

Este último uso es más rápido, no contamina el espacio de nombres de las variables del shell con lo que equivale a variables temporales, a menudo puede ser mucho más legible para los humanos y fomenta el uso de "lógica positiva", la práctica de escribir condicionales sin negaciones, que tiene simplicidad en la mayoría de las situaciones. Elimina el uso de $?en su mayor parte.

Bruce Ediger
fuente
55
Es necesaria una sintaxis más complicada cuando hay más posibilidades que solo 0 o 1: los programas a menudo comunican información útil a través de códigos de salida. Y también es útil si necesita reutilizar ese valor más adelante en el código (para iniciar sesión, por ejemplo).
mattdm
3

Además de lo que dijo cjm , si el valor de $?es 0, el proceso anterior terminó normalmente (o con éxito). De lo contrario, hubo algún error.

Barun
fuente
8
No siempre indica un error. diffsale con un 0 si los archivos comparados son iguales, con un 1 si son diferentes y 2 es un error.
Shawn J. Goff
2
Que nunca se señala un error. Es solo el estado de salida del comando anterior. Lo de "0 si la salida normal" es una convención (EXIT_SUCCESS / EXIT_FAILURE)
aviraldg
3

$?-El estado de salida del último comando ejecutado.

$0-El nombre del archivo del script actual.

$#-El número de argumentos suministrados a un script.

$$-El número de proceso del shell actual. Para los scripts de shell, este es el ID de proceso bajo el cual se están ejecutando.

Midhun S Sivan
fuente
0

PS proporcione el estado de ejecución del último comando de ejecución en el indicador. El valor '0' indica que el comando se ejecutó con éxito y '1' no es correcto.

Rahul Arora
fuente
2
No solo en las indicaciones interactivas, sino también en los scripts, y cualquier valor distinto de cero significa un error.
Kusalananda
-3

$?determina el estado de salida del comando ejecutado. $seguido de números (por ejemplo $1, $2etc.) representa los parámetros en el script de shell.

harika
fuente
Es posible que desee leer la respuesta correcta ...
jasonwryan