Ist das "$?" (Dollar-Fragezeichen) Variable nur in der Bash-Shell verfügbar?

10

In der BashShell kann ich den Befehls-Exit-Status über die $?Variable abrufen:

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

Ist es nur in der Bash-Shell verfügbar? Oder kann ich es auch in anderen Muscheln verwenden?

Nan Xiao
quelle
8
Sie können es in jeder POSIX-Shell verwenden, es ist einer der speziellen Parameter
cuonglm

Antworten:

19

Der $?Exit-Code ist für jede Shell, die POSIX folgt, gleich und wird in 2.5.2 Spezielle Parameter beschrieben :

?
Wird auf den dezimalen Exit-Status der letzten Pipeline erweitert (siehe Pipelines ).

Thomas Dickey
quelle
5
Nicht nur die POSIX-Shell, sondern auch alle Bourne-ähnlichen Shells, einschließlich der Bourne-Shell (von der ich glaube, dass sie eingeführt wurde, die Mashey-Shell hatte sie, wie $rich glaube). Das ist das Problem praktisch aller Unix-ähnlichen Systeme seit Unix V7 Ende der 70er Jahre. Die meisten anderen Shells (csh, tcsh, fish, rc) haben es als $status.
Stéphane Chazelas
2
Und viele Skriptsprachen: Perl, Ruby usw.
OrangeDog
13

Wie Thomas Dickey sagte, wird jede POSIX-Shell (dh so ziemlich alle) haben $?.

Diese Frage hat mich sehr interessiert, deshalb habe ich sie an jeder Shell getestet, die ich in die Hände bekommen konnte:

  • mksh
  • zsh
  • /bin/sh auf meinem Samsung Galaxy S5
  • /bin/sh auf meinem Router
  • tcsh
  • ksh
  • dash
  • /bin/sh auf meinem virtuellen UNIX System V von 1989 oder so
  • cmd.exeund powershell.exeauf meinem Windows 10 Computer

und $?arbeitete in all diesen aber fishund cmd.exe.

Zwei interessante Dinge gefunden:

1. $?funktioniert in Windows PowerShell!

Nun, bis zu einem gewissen Punkt. Anstatt 0 oder eine höhere Zahl zurückzugeben, ist es nur Trueund 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. $?funktioniert nicht in der Shell fish.

Wenn Sie jedoch $?Fisch eingeben, wird folgende Meldung angezeigt:

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

Ich habe es nicht viel benutzt, aber ich bin nicht überrascht, fishscheint eine eigene interessante Shell-Sprache zu haben, ganz anders als bashoder was auch immer.

Aprikosenjunge
quelle
Die meisten Muscheln (Fisch, csh, tcsh, rc, zsh) verwenden, $statuswas IMO viel einfacher / lesbarer ist. Nur Bourne-ähnliche Shells (unter Unix-Shells) verwenden $?AFAIK.
Stéphane Chazelas
3
Kommt nur darauf an, wie du liest. Ich las mental $?als "sh ## passiert?" und danach habe ich nie die Bedeutung dieser speziellen Variablen vergessen :)
2
@nwildner lol! Ich denke, das werde ich jetzt nie vergessen!
Hanetzer