scripts script resueltos programacion pasar parametros español ejercicios ejemplos comandos shell scripting

resueltos - ¿Qué es el $?(dólar signo de interrogación) variable en shell scripting?



scripts linux ejercicios resueltos (9)

Esta pregunta ya tiene una respuesta aquí:

Estoy tratando de aprender shell scripting, y necesito entender el código de otra persona. ¿Qué es el $? retención variable? No puedo buscar en Google la respuesta porque bloquean los caracteres de puntuación.


El código de salida del último comando ejecutado.


Es adecuado para la depuración en caso de que su script salga si se usa set -e . Por ejemplo, pon echo $? después del comando que lo hace salir y ver el valor de error devuelto.


Es el código de error devuelto del último comando ejecutado. 0 = éxito



PS Es el resultado (código de salida) del último comando ejecutado.


Un valor de retorno del proceso ejecutado previamente.

10.4 Obtención del valor de retorno de un programa

En bash, el valor de retorno de un programa se almacena en una variable especial llamada $ ?.

Esto ilustra cómo capturar el valor de retorno de un programa, asumo que el directorio dada no existe. (Esto también fue sugerido por Mike)

#!/bin/bash cd /dada &> /dev/null echo rv: $? cd $(pwd) &> /dev/null echo rv: $?

Vea el manual de programación de Bash para más detalles.


$? es el estado de salida de un comando, de manera que puede encadenar una serie de comandos.

Ejemplo

command1 && command2 && command3

command2 se ejecutará si command1''s $? produce un success (0) y command3 se ejecutará si $? de command2 dará un success


$? se utiliza para encontrar el valor de retorno del último comando ejecutado. Intente lo siguiente en el shell:

ls somefile echo $?

Si existe algún archivo (independientemente de si se trata de un archivo o directorio), obtendrá el valor de retorno generado por el comando ls , que debe ser 0 (valor de retorno predeterminado "exitoso"). Si no existe, debería obtener un número distinto de 0. El número exacto depende del programa.

Para muchos programas, puede encontrar los números y su significado en la página de manual correspondiente. Estos generalmente se describen como "estado de salida" y pueden tener su propia sección.


Ejemplo de C mínima

Para entender $? , primero debe entender el concepto de estado de salida del proceso.

En Linux:

  • cuando un proceso llama a la llamada del sistema de exit , el kernel almacena el valor pasado a la llamada del sistema incluso después de que el proceso muere.

    La llamada al sistema de salida es llamada por la función ANSI C de exit() , e indirectamente cuando return de main .

  • el proceso que llamó al proceso hijo saliente (Bash), a menudo con fork + exec , puede recuperar el estado de salida del hijo con la llamada en wait sistema

Considere el código Bash:

$ false $ echo $? 1

El C "equivalente" es:

false.c:

#include <stdlib.h> /* exit */ int main() { exit(1); }

bash.c:

#include <unistd.h> /* execl */ #include <stdlib.h> /* fork */ #include <sys/wait.h> /* wait, WEXITSTATUS */ #include <stdio.h> /* printf */ int main() { if (fork() == 0) { /* Call false. */ execl("./false", "./false", (char *)NULL); } int status; /* Wait for a child to finish. */ wait(&status); /* Status encodes multiple fields, * we need WEXITSTATUS to get the exit status: * http://.com/questions/3659616/returning-exit-code-from-child **/ printf("$? = %d/n", WEXITSTATUS(status)); }

En Bash, cuando presionas enter, un fork + exec + wait sucede como arriba, y luego bash establece $? Al estado de salida del proceso bifurcado.

Nota: para los comandos incorporados como echo , no es necesario echo un proceso y Bash simplemente establece $? a 0 para simular un proceso externo.

Normas y documentación

POSIX 7 2.5.2 "Parámetros especiales" http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_05_02 :

? Se expande al estado de salida decimal de la tubería más reciente (consulte la sección Tuberías).

man bash "parámetros especiales":

La cáscara trata varios parámetros especialmente. Estos parámetros solo pueden ser referenciados; La asignación a ellos no está permitida. [...]

? Se expande al estado de salida de la tubería de primer plano ejecutada más recientemente.

ANSI C y POSIX luego recomiendan que:

  • 0 significa que el programa fue exitoso

  • Otros valores: el programa falló de alguna manera.

    El valor exacto podría indicar el tipo de falla.

    ANSI C no define el significado de ningún valor, y POSIX especifica valores mayores a 125: Nunca entendí realmente: ¿qué es POSIX?

Bash usa el estado de salida por if

En Bash, a menudo usamos el estado de salida $? implícitamente para controlar if declaraciones como en:

if true; then : fi

donde true es un programa que solo devuelve 0.

Lo anterior es equivalente a:

true result=$? if [ $result = 0 ]; then : fi

Y en:

if [ 1 = 1 ]; then : fi

[ es solo un programa con un nombre extraño (y Bash incorporado que se comporta como él), y 1 = 1 ] sus argumentos, vea también: ¿Cuál es la diferencia entre corchetes simples y dobles en Bash?