Wie bekomme ich in POSIX awk den Exit-Status (Rückgabecode) von command
nachdem die Ausgabe über command | getline var
? Ich möchte mein awk-Skript exit 1
haben, wenn command
mit einem Nicht-Null-Exit-Status beendet wurde.
Angenommen, ich hätte ein awk-Skript namens foo.awk
, das folgendermaßen aussieht:
Dann möchte ich, dass Folgendes passiert:
%Vor% Laut der POSIX-Spezifikation für awk gibt command | getline
1 für eine erfolgreiche Eingabe zurück. Null für Dateiende und -1 für einen Fehler. Es ist kein Fehler, wenn command
mit einem Nicht-Null-Exit-Status beendet wird. Dies kann nicht verwendet werden, um zu sehen, ob command
ausgeführt wurde und fehlgeschlagen ist.
Gleichermaßen kann close()
nicht für diesen Zweck verwendet werden: close()
gibt nur dann einen Wert ungleich Null zurück, wenn das Schließen fehlschlägt, nicht wenn der zugehörige Befehl einen Nicht-Null-Exit-Status zurückgibt. (In gawk gibt close(command)
den Exit-Status von command
zurück. Dies ist das Verhalten, das ich möchte, aber ich denke, es verletzt die POSIX-Spezifikation und nicht alle Implementierungen von awk verhalten sich so.)
Die Funktion awk system()
gibt den Exit-Status des Befehls zurück, aber soweit ich das beurteilen kann, gibt es keine Möglichkeit, getline
damit zu verwenden.
Am einfachsten ist es, den Exit-Status von der Shell nach der Ausführung des Befehls zu wiederholen und dann mit getline zu lesen. z.B.
%Vor%Falls jemand dies liest und erwägt, getline zu verwenden, lesen Sie Ссылка und verstehen Sie alle Vorbehalte und Auswirkungen des Vorgehens so zuerst.
Keine ideale Lösung, aber Sie können:
%Vor%Es gibt einige Mehrdeutigkeiten darin, dass Sie die Zeichenkette "failure" so wählen müssen, dass der Befehl niemals die gleiche Zeichenkette erzeugen kann, aber vielleicht ist das eine angemessene Abhilfe.
Das Folgende ist erschreckend kompliziert, aber es:
fflush()
ist noch nicht im POSIX-Standard, aber es wird und es ist weit verbreitet) Der grundlegende Ansatz besteht darin, den Beendigungsstatus / Rückgabewert nach Abschluss des Befehls zu protokollieren. Wenn diese letzte Zeile ungleich Null ist, beenden Sie das awk-Skript mit einem Fehler. Um zu verhindern, dass der Code eine Textzeile verwechselt, die vom Befehl für den Exit-Status ausgegeben wird, wird jeder vom Befehl ausgegebenen Textzeile ein Buchstabe vorangestellt, der später entfernt wird.
%Vor%Sie verwenden das obige wie folgt:
%Vor%