Wie erhalte ich den Exit-Status eines Befehls in einer getline-Pipeline?

8

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:

%Vor%

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.

    
Richard Hansen 23.01.2014, 00:15
quelle

3 Antworten

3

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.

    
Ed Morton 23.01.2014, 21:30
quelle
2

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.

    
William Pursell 23.01.2014 01:03
quelle
1

Das Folgende ist erschreckend kompliziert, aber es:

  • ist POSIX-konform (meistens - fflush() ist noch nicht im POSIX-Standard, aber es wird und es ist weit verbreitet)
  • ist allgemein (es funktioniert unabhängig davon, welche Art von Ausgabe vom Befehl ausgegeben wird)
  • führt keine Verarbeitungsverzögerung ein. Die akzeptierte Antwort auf diese Frage macht eine Zeile erst verfügbar, nachdem die nächste -Zeile mit dem Befehl gedruckt wurde. Wenn der Befehl langsam Zeilen ausgibt und die Reaktionsfähigkeit wichtig ist (z. B. gelegentliche Ereignisse, die von einem IDS-System gedruckt werden und eine Firewalländerung oder E-Mail-Benachrichtigung auslösen sollten), ist diese Antwort möglicherweise besser geeignet als die angenommene Antwort.

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%     
Richard Hansen 23.01.2014 06:14
quelle

Tags und Links