Was ist "$?" Ist es eine Variable?


23

Die Frage ist ziemlich einfach. Ich kann den Beendigungscode des vorhergehenden Befehls erhalten, indem ich benutze $?. Aber was genau ist das?

Ich glaube nicht, dass es sich um eine Variable handelt, da der Name der Variablen keine Sonderzeichen außer enthält _.

foo?foo=10

wird zu dem Fehler führen: foo?foo=10: command not found

Also, wenn es keine Variable ist, was ist es dann? Gibt es andere wie es?


Antworten:


23

Was ist es?

$? ist eine integrierte Variable, die den Beendigungsstatus eines Befehls, einer Funktion oder des Skripts selbst speichert.

$?Liest den Exit-Status des zuletzt ausgeführten Befehls. Gibt nach Rückkehr einer Funktion $?den Exit-Status des zuletzt in der Funktion ausgeführten Befehls an. Auf diese Weise gibt Bash Funktionen einen "Rückgabewert". Es wird 0bei Erfolg oder einer Ganzzahl im 1 - 255Fehlerbereich zurückgegeben.

Gibt es andere wie es auch?

Ja, in bash gibt es mehrere solche eingebauten Variablen. Sie können eine Liste siehe hier . Siehe: http://www.tldp.org/LDP/abs/html/exit-status.html


1
Ist es also nur in der Bash-Shell verfügbar?
Daltonfury42

4
@ daltonfury42 nein, jede Schale , dass Versuche , eine gewisse Kompatibilität mit der Bourne - Shell haben wird es unterstützen (einschließlich dash, ksh, zshua).
muru

2
CSH und Fisch verwenden $statusfür den gleichen Zweck
Glenn Jackman

22

$? ist eine Variable, aber eine spezielle, deshalb sind Sonderzeichen erlaubt. ($?)Wird auf den Exit-Status der zuletzt ausgeführten Vordergrund-Pipeline erweitert.

Es ist nicht die einzige, die Shell behandelt mehrere Parameter speziell. Diese Parameter dürfen nur referenziert werden; eine Zuordnung zu ihnen ist nicht erlaubt:

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 $@.

Quellen:


2
"$*"ist nicht nur alle Positionsparameter als ein einzelnes Wort, sondern alle Positionsparameter, die durch das erste Zeichen von IFSals ein einzelnes Wort getrennt sind. Da das Ergebnis einer Feldaufteilung unterliegt, wenn es nicht in Anführungszeichen gesetzt wird, wird der Effekt wie $@im nicht zitierten Fall verwendet.
muru

1
Um sicherzugehen: $ @ und $ * ohne Anführungszeichen sind identisch, da beide der Wortteilung unterliegen. Mit "$ @" wird die Wortteilung der Positionsparameter beibehalten, auch wenn ein einzelner Parameter ein Zeichen in IFS enthält.
Kojiro

1
Gibt es eine Referenz von seit wann das für Muscheln verwendet wird? Ich frage mich, ob Perl diese aus Shell-Skripten übernommen hat.
Simbabque

Dies ist um Jahrzehnte (oder mindestens Jahre) älter als Perl. Ein Großteil der Perl-Syntax wurde von der Shell-Syntax beeinflusst. (Perl wurde 1987 geboren, und ein Großteil dieser Syntax stammt aus der ursprünglichen Bourne-Shell (1977). Ich bin nicht zu 100% bei der Einführung von $ _, aber mit ziemlicher Sicherheit schon vor 1987.
Popup

6

$?ist ein besonderes Shell-Parameter (Variable).

Im Allgemeinen müssen alle benutzerdefinierten Variablen nur mit den Zeichen der Zeichenklasse benannt werden, [:alnum:]dh [a-zA-Z0-9_](kann auch nicht mit beginnen[0-9] ).

Kurz gesagt, $?ist eine spezielle Variable ( und es gibt einige davon) ), die als internes Merkmal der Shell selbst betrachtet werden kann und den Exit-Code des vorherigen Befehls liefert (ob erfolgreich oder fehlgeschlagen).

Sie können dies lesen , um mehr über Variablen zu erfahren.


4

$?ist eine spezielle Variable in der Bash, die immer den Return / Exit-Code enthält des zuletzt ausgeführten Befehls enthält.

Sie können es in einem Terminal anzeigen, indem Sie ausführen echo $? .

Rückkehrcodes liegen im Bereich [0; 255].
Ein Rückkehrcode von 0bedeutet normalerweise, dass alles in Ordnung ist.
Andere Werte weisen auf Fehler hin. Die meisten Anwendungen kehren zurück1 Werte oder benutzerdefinierte Werte zurück. Wenn ein Befehl nicht gefunden wurde, enthält die Variable normalerweise127

Wenn Sie diese Variable auf einen bestimmten Wert setzen möchten, können Sie dies einfach mit tun bash -c "exit 5", um beispielsweise den Rückkehrcode zurückzugeben 5.


Eine Shell-Funktion ist eine POSIX-konforme Methode, um den Exit-Status zu setzen, ohne zwangsläufig zu forken. setstatus() { return 5; }
Kojiro
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.