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?


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 ).


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.