HOWTO zu Shell-Exit-Codes
(C) 2006 T.Birnthaler/H.Gottschalk <howtos(at)ostc.de>
         OSTC GmbH, www.ostc.de
$Id: shell-exit-code-HOWTO.txt,v 1.4 2009-03-25 09:22:43 tsbirn Exp $

Dieses Dokument beschreibt die Bedeutung und den Einsatz von Shell-Exit-Codes.

Jedes Kommando (jeder Prozess) gibt bei seinem Ende einen "Exit-Code"
(kleiner Wert im Bereich 0-255) zurück, über den es seinem Vaterprozeß
mitteilt, ob es korrekt ablief oder ob ein Fehler auftrat.

  | Code       | Bedeutung                                              |
  +------------+--------------------------------------------------------+
  | 0          | Kommando lief korrekt ab                               |
  | ungleich 0 | Bei der Ausführung des Kommandos trat ein Fehler auf   |
  |            | (Wert kann die Fehlerart beschreiben, muss aber nicht) |
  +------------+--------------------------------------------------------+

Die Bedeutung der einzelnen Exit-Fehlercodes ist von Kommando zu
Kommando verschieden und kann in den jeweiligen man-Pages nachgelesen
werden.

Der Exit-Code kann NUR direkt anschließend an das Kommando von
Shell-Kontrollstrukturen abgefragt und über das Kommando "test" für
Verzweigungen des Programmflusses benutzt werden. Er steht auch in der
Shell-Variablen "$?" (bzw. "$status" bei der (t)csh) und kann darüber
ausgegeben werden. Beispiele:

  grep TEXT FILE   # 0 falls TEXT (Muster) in FILE gefunden
                   # 1 falls TEXT (Muster) in FILE nicht gefunden
                   # 2 falls FILE nicht vorhanden oder TEXT (Muster) fehlerhaft
  echo $?          # Exit-Code ausgeben (nur 1x sinnvoll, da "echo" auch Kmdo.)
  echo $?          # Exit-Code von vorherigem "echo" (Wert "0" da erfolgreich)

Da für die Shell der Wert 0 "logisch wahr" bedeutet und alle anderen Werte
1, 2, ... für sie "logisch falsch" bedeuten, kann der Exit-Code den Ablauf
eines Shell-Skriptes beeinflussen.

  [ -f /tmp/text ] && echo "Datei '/tmp/text' existiert"
  [ -d /tmp/dir  ] || echo "Verzeichnis '/tmp/dir' existiert nicht"

Da jedes Kommando und jedes Programm einen Exit-Code erzeugt, kann sein
Erfolg anschließend sofort überprüft und entsprechend reagiert werden:

  grep "error:" /tmp/log > /dev/null && echo "Fehler in Log gefunden"
  mv text /tmp || echo "Datei 'text' konnte nicht verschoben werden"
  chmod a+w log || echo "Datei 'log' nicht für alle schreibbar"

  if grep "error:" /tmp/log > /dev/null
  then
      echo "$(grep -c "error:" /tmp/log > /dev/null) Fehler in Log gefunden"
  else
      echo "Alles in Ordnung"
  fi

Fest vordefinierte Exit-Codes der Shell sind (bash, ksh):

  | Code     | Bedeutung                                                   |
  +----------+-------------------------------------------------------------+
  | 126      | Kommando gefunden, aber nicht lesbar/ausführbar (bash, ksh) |
  | 127      | Kommando nicht gefunden (bash, ksh)                         |
  | 128 + NN | Signal NN führte zu Kommando-Abbruch (bash, ksh)            |
  +----------+-------------------------------------------------------------+