Was bedeutet $? in einem Shell-Skript?

Antworten:

26

Die Antwort von Cjm ist richtig, $?kann aber auf alberne Weise in Shell-Skripten verwendet werden, und ich möchte davor warnen. Viele schlechte Shell-Skripte haben ein wiederholtes Codemuster:

run_some_command
EXIT_STATUS=$?

if [ "$EXIT_STATUS" -eq "0" ]
then
    # Do work when command exists on success
else
    # Do work for when command has a failure exit
fi

Wenn es überhaupt möglich ist (Lesbarkeitsbedenken können manchmal auftreten), sollten Sie diese Situation anders codieren:

if run_some_command
then
    # Do work when command exists on success
else
    # Do failure exit work
fi

Diese letztere Verwendung ist schneller, verschmutzt den variablen Namespace der Shell nicht mit temporären Variablen, kann für den Menschen oft viel besser lesbar sein und fördert die Verwendung von "positiver Logik", der Praxis des Schreibens von Bedingungen ohne Negationen, die kognitiv sind Einfachheit in den meisten Situationen. Es entfällt $?größtenteils die Verwendung von .

Bruce Ediger
quelle
5
Eine kompliziertere Syntax ist erforderlich, wenn es mehr Möglichkeiten als nur 0 oder 1 gibt - Programme kommunizieren häufig nützliche Informationen über Exit-Codes. Dies ist auch nützlich, wenn Sie diesen Wert später im Code wiederverwenden müssen (zum Beispiel für die Protokollierung).
Mattdm
3

Zusätzlich zu dem, was cjm sagte , $?wurde der vorherige Prozess normal (oder erfolgreich) beendet , wenn der Wert 0 ist. Ansonsten ist ein Fehler aufgetreten.

Barun
quelle
8
Es signalisiert nicht immer einen Fehler. diffBeendet mit einer 0, wenn die verglichenen Dateien identisch sind, mit einer 1, wenn sie unterschiedlich sind, und 2 ist ein Fehler.
Shawn J. Goff
2
Es wird niemals ein Fehler angezeigt. Es ist nur der Beendigungsstatus des vorherigen Befehls. Die "0 wenn normaler Ausgang" Sache ist eine Konvention (EXIT_SUCCESS / EXIT_FAILURE)
aviraldg
3

$?-Der Exit-Status des zuletzt ausgeführten Befehls.

$0-Der Dateiname des aktuellen Skripts.

$#-Die Anzahl der Argumente, die an ein Skript übergeben wurden.

$$-Die Prozessnummer der aktuellen Shell. Bei Shell-Skripten ist dies die Prozess-ID, unter der sie ausgeführt werden.

Midhun S Sivan
quelle
0

$? Geben Sie uns bei Aufforderung den Ausführungsstatus des letzten Ausführungsbefehls. Der Wert '0' zeigt an, dass der Befehl erfolgreich ausgeführt wurde, und '1' bedeutet, dass der Befehl nicht erfolgreich ausgeführt wurde.

Rahul Arora
quelle
2
Nicht nur bei den interaktiven Eingabeaufforderungen, sondern auch in Skripten. Ein Wert ungleich Null bedeutet einen Fehler.
Kusalananda
-3

$?Bestimmt den Exit-Status des ausgeführten Befehls. $gefolgt von Zahlen (zB $1, $2usw.) die Parameter in dem Shell - Skript darstellt.

harika
quelle
Vielleicht möchten Sie die richtige Antwort lesen ...
Jasonwryan