¿Es el "$?" (dólar-signo de interrogación) variable disponible solo en el shell Bash?

10

En el Bashshell, puedo obtener el estado de salida del comando a través de la $?variable:

# ps -ef | grep "haha"
root     15439 15345  0 23:02 pts/0    00:00:00 grep --color=auto haha
# echo $?
0

¿Está disponible solo en el shell Bash? ¿O también puedo usarlo en otros proyectiles?

Nan Xiao
fuente
8
Puede usarlo en cualquier shell POSIX, es uno de los parámetros especiales
Cuonglm

Respuestas:

19

El $?código de salida es común a cualquier shell que sigue a POSIX, y se describe en 2.5.2 Parámetros especiales :

?
Se expande al estado de salida decimal de la canalización más reciente (consulte Canalizaciones ).

Thomas Dickey
fuente
55
No solo el shell POSIX, todos los shells tipo Bourne, incluido el shell Bourne (que creo que fue el que lo introdujo, el shell Mashey lo tenía como $rcreo). Así que ese es el aspecto de prácticamente todos los sistemas similares a Unix desde Unix V7 a finales de los 70, la mayoría de los otros shells (csh, tcsh, fish, rc) lo tienen como $status.
Stéphane Chazelas
2
Y muchos lenguajes de script: Perl, Ruby, etc.
OrangeDog
13

Como dijo Thomas Dickey, cualquier shell POSIX (es decir, casi todos) tendrá $?.

Esta pregunta me interesó bastante, así que la probé en cualquier shell que pudiera tener en mis manos:

  • mksh
  • zsh
  • /bin/sh en mi Samsung Galaxy S5
  • /bin/sh en mi enrutador
  • tcsh
  • ksh
  • dash
  • /bin/sh en mi sistema virtual UNIX V desde 1989 más o menos
  • cmd.exey powershell.exeen mi computadora con Windows 10

y $?trabajado en todos estos pero fishy cmd.exe.

Encontramos dos cosas interesantes:

1. $?funciona en Windows PowerShell!

Bueno, hasta cierto punto. En lugar de devolver 0 o un número mayor, es justo Truey False.

PS C:\WINDOWS\system32> echo $?
True
PS C:\WINDOWS\system32> gfdhgfhfdgfdg
gfdhgfhfdgfdg : The term 'gfdhgfhfdgfdg' is not recognized as the name of a cmdlet, ...(big long error output).....
PS C:\WINDOWS\system32> echo $?
False

2. $?no funciona en el shell fish.

Sin embargo, cuando escribe $?pescado, recibe este mensaje:

~$ echo $?
$? is not the exit status. In fish, please use $status.
fish: echo $?

No lo he usado mucho, pero no me sorprende, fishparece tener su propio lenguaje de shell interesante, completamente diferente basho lo que sea.

chico albaricoque
fuente
La mayoría de las conchas (fish, csh, tcsh, rc, zsh) usan $statusuna OMI mucho más sencilla / legible. Solo los proyectiles tipo Bourne (entre los proyectiles Unix) usan $?AFAIK.
Stéphane Chazelas
3
Solo depende de cómo estés leyendo. Leí mentalmente $?como "sh ## sucedió?" y después de eso, nunca olvidé el significado de esta variable especial :)
2
@nwildner lol! ¡Creo que nunca lo olvidaré ahora!
hanetzer