Que hace
echo $?significa en la programación de shell?
                    
                        shell
                                scripting
                                special-characters
                                
                    
                    
                        Harshay Buradkar
fuente
                
                fuente

Respuestas:
Este es el estado de salida del último comando ejecutado.
Por ejemplo, el comando
truesiempre devuelve un estado de0yfalsesiempre devuelve un estado de1:Del manual: (accesible llamando a
man bashen su shell)Por convención, un estado de salida
0significa éxito, y un estado de retorno distinto de cero significa falla. Obtenga más información sobre los estados de salida en wikipedia .Hay otras variables especiales como esta, como puede ver en este manual en línea: https://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
fuente
$y?son dos parámetros distintos y$?no aparece en la página de manual de bash (1).$?devuelve el valor de salida del último comando ejecutado.echo $?imprime ese valor en la consola. cero implica una ejecución exitosa, mientras que los valores distintos de cero se asignan a varios motivos de falla.Por lo tanto, al crear scripts; Tiendo a usar la siguiente sintaxis
La comparación se debe hacer en iguales
0o no iguales0.** Actualización basada en el comentario: Idealmente, no debe usar el bloque de código anterior para la comparación, consulte los comentarios y la explicación de @tripleee.
fuente
cmd; if [ $? -eq 0 ]; thendebería ser refactorizadaif cmd; then. El propósito mismo deif(y las otras declaraciones de control de flujo en el shell) es ejecutar un comando y examinar su estado de salida.if cmd;puede no ser muy legible en algunas condiciones, especialmente cuando cmd se refiere a otro script.[ 1 ]y[ 0 ]son ambos verdaderos;[sin un operador comprueba si el argumento es una cadena no vacía.vendor/bin/drush status bootstrap | grep -q $(vendor/bin/drush php-eval 'if (function_exists("t")) echo t("Successful");') &> /dev/null;. Si tuviera que poner eso en una sola líneaif [ ... ], sería terriblemente ilegible. Planeo almacenar la salida de esa línea en una variable para poder decirif [ $drupal_installed -eq 0 ]más tarde.echo $? - Da el ESTADO DE SALIDA del comando ejecutado más recientemente . Este ESTADO DE SALIDA probablemente sea un número con CERO que implique Éxito y cualquier valor NO CERO que indique Falla
? - Este es un parámetro / variable especial en bash.
PS - Da el valor almacenado en la variable "?".
Algunos parámetros especiales similares en BASH son 1,2, *, # (normalmente visto en el comando echo como $ 1, $ 2, $ *, $ #, etc.,).
fuente
Tiene el último código de estado (valor de salida) de un comando.
fuente
Ejemplo de estado de salida mínimo de POSIX C
Para comprender
$?, primero debe comprender el concepto de estado de salida del proceso que define POSIX . En Linux:cuando un proceso llama a la
exitllamada del sistema, el núcleo almacena el valor pasado a la llamada del sistema (unint) incluso después de que el proceso falle.La
exit()función ANSI C llama a la llamada del sistema de salida , e indirectamente cuando lo hacereturndesdemain.El proceso que llamó al proceso secundario existente (Bash), a menudo con
fork+exec, puede recuperar el estado de salida del elemento secundario con lawaitllamada al sistemaConsidere el código Bash:
El "equivalente" C es:
falso.c
bash.c
Compilar y ejecutar:
Salida:
En Bash, cuando presiona enter, se produce una bifurcación + exec + espera como arriba, y bash luego establece
$?el estado de salida del proceso bifurcado.Nota: para comandos integrados como
echo, un proceso no necesita ser generado, y Bash solo establece$?en 0 para simular un proceso externo.Estándares 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 :
man bash"Parámetros especiales":ANSI C y POSIX luego recomiendan que:
0significa que el programa fue exitosootros 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 que 125: ¿Cuál es el significado de "POSIX"?
Bash usa el estado de salida para
ifEn Bash, a menudo usamos el estado de salida
$?implícitamente para controlar lasifdeclaraciones como en:donde
truees un programa que solo devuelve 0.Lo anterior es equivalente a:
Y en:
[es solo un programa con un nombre extraño (y Bash incorporado que se comporta como tal), y1 = 1 ]sus argumentos, vea también: Diferencia entre corchetes simples y dobles en Bashfuente
De http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
fuente
Consulte el Manual de Bash en 3.4.2 Parámetros especiales :
Es un poco difícil de encontrar porque no aparece como
$?(el nombre de la variable es "solo"?). También vea la sección de estado de salida , por supuesto ;-)Feliz codificación
fuente
Emite el resultado del último comando unix ejecutado
fuente