¿Qué es `$?` ¿Es una variable?


23

La pregunta es bastante directa. Puedo obtener el código de salida del comando anterior usando $?. ¿Pero qué es exactamente?

No creo que sea una variable, porque no puede tener caracteres especiales en el nombre de la variable que no sea _.

foo?foo=10

dará como resultado el error: foo?foo=10: command not found

Entonces, si no es una variable, ¿qué es? ¿Hay otros como este?


Respuestas:


23

¿Qué es?

$? es una variable integrada que almacena el estado de salida de un comando, función o el script en sí.

$?lee el estado de salida del último comando ejecutado. Después de que una función regresa, $?da el estado de salida del último comando ejecutado en la función. Esta es la forma en que Bash le da a las funciones un "valor de retorno". Devuelve 0en caso de éxito o un número entero en el rango 1 - 255de error.

¿Hay otros como él también?

Sí, hay varias variables incorporadas en bash. Puedes ver una lista aquí . Consulte: http://www.tldp.org/LDP/abs/html/exit-status.html


1
Entonces, ¿está disponible solo en bash shell?
daltonfury42

44
@ daltonfury42 no, cualquier shell que los intentos de tienen cierta compatibilidad con el shell Bourne va a apoyar (incluyendo dash, ksh, zsh, entre otros).
muru

2
CSH y el uso de pescado $statuspara el mismo propósito
Glenn Jackman

22

$?es una variable pero especial, por eso se permiten caracteres especiales. ($?)Se expande al estado de salida de la canalización en primer plano ejecutada más recientemente.

No es el único, el shell trata varios parámetros especialmente. Estos parámetros solo pueden ser referenciados; la asignación a ellos no está permitida:

Variable    Meaning
$0          Filename of script
$1          Positional parameter #1
$2 - $9     Positional parameters #2 - #9
${10}       Positional parameter #10
$#          Number of positional parameters
"$*"        All the positional parameters (as a single word) *
"$@"        All the positional parameters (as separate strings)
${#*}       Number of positional parameters
${#@}       Number of positional parameters
$?          Return value
$$          Process ID (PID) of script
$-          Flags passed to script (using set)
$_          Last argument of previous command
$!          Process ID (PID) of last job run in background

* Must be quoted, otherwise it defaults to $@.

Fuentes:


2
"$*"no es solo todos los parámetros posicionales como una sola palabra, sino todos los parámetros posicionales separados por el primer carácter de IFScomo una sola palabra. Dado que el resultado estará sujeto a la división de campos si no se cita, el efecto es como si $@se usara en el caso no citado .
muru

1
Para estar seguros: no indicada $ @ y $ * son los mismos, ya que son tanto sujetos a la división de palabras. Citado, "$ @" conserva la división de palabras de los parámetros posicionales, incluso si un parámetro individual contiene un carácter en IFS.
kojiro

1
¿Hay alguna referencia de cuándo se usa para proyectiles? Me pregunto si Perl tomó esos del scripting de shell.
simbabque

Esto es anterior a Perl por décadas (o al menos años). Gran parte de la sintaxis de Perl fue influenciada por la sintaxis de shell. (Perl nació en 1987, y gran parte de esta sintaxis provino del shell Bourne original (1977). No estoy al 100% cuando se introdujo $ _, pero casi con certeza fue mucho antes de 1987.
Popup

6

$?es un parámetro de shell especial (variable).

En general, todas las variables definidas por el usuario deben nombrarse utilizando solo los caracteres de la clase de caracteres, [:alnum:]es decir [a-zA-Z0-9_](tampoco puede comenzar con [0-9]).

En pocas palabras, $?es una variable especial ( y hay bastantes de estas ) que puede considerarse como una característica interna del propio shell que proporciona el código de salida del comando anterior (ya sea exitoso o fallido).

Puede leer esto para tener más idea sobre las variables.


4

$?es una variable especial en bash que siempre contiene el código de retorno / salida del último comando ejecutado.

Puede verlo en una terminal ejecutando echo $?.

Los códigos de retorno están en el rango [0; 255].
Un código de retorno 0generalmente significa que todo está bien.
Otros valores indican errores. La mayoría de las aplicaciones devuelven 1valores personalizados. Si no se encontró un comando, la variable generalmente contiene127

Si desea establecer esta variable en un valor específico, puede hacerlo fácilmente bash -c "exit 5"para devolver, por ejemplo, el código de retorno 5.


Una función de shell es una forma compatible con POSIX para establecer el estado de salida sin necesariamente bifurcación. setstatus() { return 5; }
kojiro
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.