Welche Rückgabe-/Exit-Werte kann ich in Bash-Funktionen/-Skripten verwenden?

Welche Rückgabe-/Exit-Werte kann ich in Bash-Funktionen/-Skripten verwenden?

Ich möchte wissen, welche Rückgabewerte wir verwenden können, die nicht mit z. B. SIGINT verwechselt werden?

ex.:

$sleep 10
$#hit ctrl+c
$echo $?
130

also weiß ich, dass ich nichts wie return 130oder verwenden darfexit 130

das hier wäre also irreführend:

$function FUNC(){ return 130; };FUNC;echo $?
130

Antwort1

Der Beendigungsstatus eines Prozesses wird als Wert kodiertzwischen 0 und 255, das ist also alles, was Sie als Exit-Code verwenden können. Wenn Sie einen Wert außerhalb dieses Bereichs übergeben, verwenden die meisten Shells den Rest Modulo 256. Einige Shells erlauben einen größeren Bereich ganzer Werte für Funktionen.

Die einzige Regel für Exit-Codes ist, dass0 bedeutet Erfolg und jeder andere Wert bedeutet Misserfolg. Diese Regel gilt nicht nur für Unix: Sie ist auch eine gängige Konvention für andere Betriebssysteme (einschließlich DOS, Windows und vielen eingebetteten Systemen, die ein Konzept von Exit-Code haben, aber VMS macht das anders). In Unix-Systemen ist sie in die booleschen Konstrukte der Shell ( if, while, &&, ||, !, set -e, …) und in eingebrannt makeund wird von allen Standarddienstprogrammen befolgt. In POSIX-C-ProgrammenEXIT_SUCCESSist 0 und EXIT_FAILUREein von Null verschiedener Wert (normalerweise 1).

Es gibt keine Regel (de facto oder de jure) bezüglich der Wahl von Exit-Codes bei Fehlern. Nur wenige POSIX-Dienstprogramme schreiben bestimmte Fehlerstatuscodes vor:

  • Der !Shell-Operator gibt 1 zurück, wenn sein Operand 0 zurückgibt. Der &&Und- ||Operator übergibt den Status des letzten Befehls.
  • cmpUnddiffGibt 1 für unterschiedliche Dateien und ≥2 für Fehlerbedingungen zurück.
  • exprGibt 1 zurück, wenn der Ausdruck Null oder Null ergibt, 2 bei einem ungültigen Ausdruck und ≥3 bei anderen Fehlern.
  • grepgibt 1 für „nicht gefunden“ und ≥2 für Fehlerzustände zurück. Viele Suchbefehle folgen diesem (aber nicht find, das 0 zurückgibt, wenn keine Datei übereinstimmt).
  • mesgGibt 0 für Ja, 1 für Nein und ≥2 für Fehler zurück.
  • patchGibt 1 zurück, wenn ein Hunk abgelehnt wurde, und ≥2 bei anderen Fehlern.
  • sort -cGibt 1 zurück, wenn die Dateidaten nicht sortiert sind, und ≥2 bei Fehlern.
  • compressUndlocaledefDefinieren Sie einige kleine Werte für bestimmte Fehler.

Es gibt eine verbreitete, aber nicht universelle Vorstellung, dass höhere Werte schlimmere Fehler bedeuten. Bei Befehlen, die eine boolesche Bedingung wie grep(ist dieses Muster vorhanden?) und diff(sind diese Dateien identisch?) testen, bedeutet 1 „nein“ und höhere Werte weisen auf einen Fehler hin. Außerdem gilt:Werte ab 126 werden selten verwendetcommand, da sie in die Shell (und die POSIX-Befehle , env, nice, nohupund ) eingebrannt sind time:

  • 126 und 127 zeigen einen Fehler beim Aufrufen eines externen Befehls an;
  • Werte über 128 $?weisen auf einen Befehl hin, der durch ein Signal beendet wurde.

/usr/include/sysexits.hlistet einige Werte mit ihren Bedeutungen auf, aber es stammt von Sendmail und ich habe es noch nie außerhalb von Programmen gesehen, die nichts mit der E-Mail-Zustellung zu tun haben.

Zusammenfassend lässt sich sagen, dass bei Erfolg 0 und bei Misserfolg entweder 1 oder 2 zurückgegeben wird. Wenn Sie zwischen Fehlerfällen unterscheiden müssen, beginnen Sie bei 1 und erhöhen Sie den Wert bei schwerwiegenderen Fehlern.

Antwort2

Konventionen für den Beendigungsstatus

Technisch gesehen können Sie jeden Wert zwischen 0 und 255 verwenden. Es gibt jedoch eine Reihe bestehender Konventionen, die Sie verwenden können:

  • Exit-Code 1 alsCatch-All für allgemeine Fehler.
  • Exit-Codes 64-78 vonsysexits.hum die Fehlerklasse anzugeben. Diese können Sie in der Regel in/usr/include/sysexits.h, das vom Debian/Ubuntu-Paket libc6-dev installiert wird.
  • Exit-Codes vonerrno.hSie können diese auch mit demFehlerBefehl aus dem Paket moreutils. Auf meinem System errno --listwerden derzeit 134 definierte Fehler angezeigt.

Dokumentieren und Anzeigen

Im Allgemeinen ist es eine gute Idee, die in Ihrem Skript verwendeten Exit-Codes zu dokumentieren oder zumindest die Konvention, die Sie befolgen. Es kann auch nützlich sein, vor dem Beenden eine eindeutige Meldung anzuzeigen, etwa:

# using sysexits.h
echo "EX_USAGE: invalid argument: $1" > /dev/stderr
exit 64

# using errno.h
echo "ENOENT: File not found: $file" > /dev/stderr
exit 2

Antwort3

Sie können jede beliebige Zahl zwischen 0 und 255 verwenden, außerReservierte Exit-Codes(Klicken Sie hier, um mehr zu erfahren)

verwandte Informationen