wake-up-neo.net

Was bedeutet "$"? Gib uns genau ein Shell-Skript?

Ich habe den Code irgendwo online geschrieben und wollte wissen, was genau "$?" tun/gib uns . Googeln hat nicht geholfen.

Hier ist der Code, in dem ich ihn gesehen habe:

#!/bin/sh

ping -c 2 localhost
if [ $? != 0 ] ; then
    echo "Couldn't ping localhost, weird"
    fi

ping -c 2 veryweirdhostname.noend 
if [ $? != 0 ] ; then
    echo "Surprise, Couldn't ping a very weird hostname.."
    fi

echo "The pid of this process is $$"

Entnommen aus: http://efod.se/writings/linuxbook/html/Shell-scripts.html

25
Khushman Patel

$? ist eine Variable, die den Rückgabewert des zuletzt ausgeführten Befehls enthält.

Beispiel C Programm (example.c):

int main() { return 1; }

Beispiel Bash:

gcc -o example example.c
./example
echo $? # prints 1
35
Brendan Long

Den meisten Antworten fehlt etwas Detail. Eine definitive Antwort finden Sie im POSIX-Standard für die Shell, im Abschnitt über spezielle Parameter :

$? Erweitert auf den Dezimal-Exit-Status der neuesten Pipeline (siehe Pipelines).

Lassen Sie sich nicht von Word pipeline überraschen, denn selbst ein einfacher Befehl wie ls ist eine aus einem einzigen Befehl bestehende Pipeline. Aber was ist $? für eine Pipeline mit mehreren Befehlen? Dies ist der Beendigungsstatus des Befehls last in der Pipeline.

Und was ist mit Pipelines, die im Hintergrund ausgeführt werden, wie grep foo bigfile|head -n 10 > result &

Ihr Exit-Status kann über wait abgerufen werden, wenn der letzte Befehl der Pipeline abgeschlossen ist .. _ Die Hintergrundprozess-PID ist als $! verfügbar, und $? meldet nur, ob der Hintergrundbefehl korrekt started war.

Ein weiteres erwähnenswertes Detail ist, dass der Exit-Status normalerweise im Bereich von 0 bis 255 liegt, wobei 128 bis 255 angeben, dass der Prozess aufgrund eines Signals beendet wurde. Die Rückgabe anderer Werte aus einem C-Programm wird in $? wahrscheinlich nicht genau wiedergegeben.

12
Jens

Es ist der Rückkehrcode des zuletzt ausgeführten Befehls.

Nach der Konvention ist 0 ein erfolgreicher Abbruch, und eine Nicht-Null weist auf eine Art Fehler hin.

6
evil otto

Diese spezielle Variable zeigt den Beendigungsstatus des letzten Befehls an, der in einem Skript oder einer Befehlszeile ausgeführt wurde. In einer Befehlszeile könnte der Benutzer beispielsweise eingeben

 who; echo $?

Die Ausgabe wäre dann

 user  tty7         2014-07-13 19:47
 0

Dies zeigt die Ausgabe von who und den Beendigungsstatus des Befehls. Ein Skript wäre dasselbe.

 #!/bin/bash
 who
 echo $?

Ausgabe: 0

1
user1744127

die anderen Antworten decken ziemlich gut Bash ab, aber Sie geben in Ihrer Frage keine Shell an. In csh (und tcsh) kann $? verwendet werden, um Abfrage der Existenz von Variablen , z.

if $?my_var then
    echo my_var exists
endif
0
craq