Le "$?" (point d'interrogation dollar) variable disponible uniquement dans le shell Bash?

10

Dans le Bashshell, je peux obtenir l'état de sortie de la commande via la $?variable:

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

Est-il disponible uniquement dans le shell Bash? Ou puis-je également l'utiliser dans d'autres coques?

Nan Xiao
la source
8
Vous pouvez l'utiliser dans n'importe quel shell POSIX, c'est l'un des paramètres spéciaux
cuonglm

Réponses:

19

Le $?code de sortie est commun à tout shell qui suit POSIX et est décrit dans 2.5.2 Paramètres spéciaux :

?
Se développe au statut de sortie décimal du pipeline le plus récent (voir Pipelines ).

Thomas Dickey
la source
5
Non seulement le shell POSIX, tous les shells de type Bourne, y compris le shell Bourne (qui, je crois, était celui qui l'a présenté, le shell Mashey l'avait comme $rje le crois). C'est donc le sh de pratiquement tous les systèmes de type Unix depuis Unix V7 à la fin des années 70, la plupart des autres shells (csh, tcsh, fish, rc) l'ont comme $status.
Stéphane Chazelas
2
Et de nombreux langages de script: Perl, Ruby, etc.
OrangeDog
13

Comme l'a dit Thomas Dickey, n'importe quel shell POSIX (c'est-à-dire à peu près tous) en aura $?.

Cette question m'a beaucoup intéressé, alors je l'ai testé sur n'importe quel shell sur lequel je pouvais mettre la main:

  • mksh
  • zsh
  • /bin/sh sur mon Samsung Galaxy S5
  • /bin/sh sur mon routeur
  • tcsh
  • ksh
  • dash
  • /bin/sh sur mon système UNIX virtuel V de 1989 environ
  • cmd.exeet powershell.exesur mon ordinateur Windows 10

et a $?travaillé dans tous ces mais, fishet cmd.exe.

Trouvé deux choses intéressantes:

1. $?fonctionne dans Windows PowerShell!

Eh bien, jusqu'à un certain point. Au lieu de retourner 0 ou un nombre supérieur, c'est juste Trueet 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. $?ne fonctionne pas dans le shell fish.

Cependant, lorsque vous tapez $?du poisson, vous obtenez ce message:

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

Je ne l'ai pas beaucoup utilisé mais je ne suis pas surpris, fishsemble avoir son propre langage shell intéressant, complètement différent bashou autre.

garçon abricot
la source
La plupart des coquilles (poisson, csh, tcsh, rc, zsh) utilisent $statusce qui est beaucoup plus simple / lisible IMO. Seuls les shells de type Bourne (parmi les shells Unix) utilisent $?AFAIK.
Stéphane Chazelas
3
Tout dépend de la façon dont vous lisez. J'ai lu mentalement $?que "sh ## s'est-il passé?" et après cela, je n'ai jamais oublié la signification de cette variable spéciale :)
2
@nwildner lol! Je pense que je n'oublierai jamais ça maintenant!
hanetzer