GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Gnu Awk Errno bei Befehlsfehler nicht gesetzt?

Ich habe versucht, ein paar Befehle mit getline() auszuführen Funktion von GNU awk und drucken Sie die Fehlernummer (errno ) zurückgegebener Wert. Aber für einfache Fehlerfälle von nicht existierenden Verzeichnissen/Dateien scheint die Variable nicht gefüllt zu sein.

awk 'BEGIN {
        cmd = "ls -lrth /non/existing/path"
        while ( ( cmd | getline result ) > 0 ) {
            print result
        }
        close(cmd); print ENVIRON["ERRNO"]
}'

Wenn das obige die Fehlerzeichenfolge von ls ausgibt , der print -Anweisung erzeugt keine gültige Fehlernummer. Ich habe auch versucht, von der Manpage aus PROCINFO["errno"] zu verwenden und PROCINFO["ERRNO"] was nicht funktionierte. Ich habe auch versucht, es zu drucken, bevor ich den Dateideskriptor geschlossen habe, was auch nicht funktioniert hat. Ist es falsch, ENOENT zu erwarten in diesem Fall?

Akzeptierte Antwort:

Sie können die Fehlernummer nicht mit getline abrufen . In Ihrem Befehl stammt die Ausgabe von ls , nicht print result .

Im Formular cmd | getline result , cmd ausgeführt wird, dann wird seine Ausgabe an getline geleitet . Es gibt 1 zurück wenn ausgegeben, wenn EOF, -1 auf Versagen. Das Problem ist, dass der Fehler vom Ausführen von getline herrührt selbst, nicht der Rückgabecode von cmd . Beispiel:

awk 'BEGIN {
while ( ( getline result < "/etc/shadow") > 0 ) {
            print result
        }
        print "XXX: ", ERRNO
}'
XXX:  Permission denied

Sie werden diesen /etc/shadow sehen kann nicht gelesen werden, also getline läuft nicht und meldet den Fehler in ERRNO Variable.

Beachten Sie, dass GNU awk den cmd zurückgibt Status wenn nicht im Posix-Modus, also können Sie Folgendes tun:

awk 'BEGIN {
    cmd = "ls -lrth /non/existing/path"
    while ( ( cmd | getline result ) > 0 ) {
        print result
    }
    status=close(cmd);
    if (status != 0) {
        code=and(rshift(status, 8),0xFF)
        printf("Exit status: %d, exit code: %d\n", status, code)
    }
}'
ls: cannot access '/non/existing/path': No such file or directory
Exit status: 512, exit code: 2

Im POSIX-Modus erhalten Sie den Exit-Status nicht:

POSXILY_CORRECT=1 awk 'BEGIN {
    cmd = "ls -lrth /non/existing/path"
    while ( ( cmd | getline result ) > 0 ) {
        print result
    }
    status=close(cmd);
    if (status != 0) {
        code=and(rshift(status, 8),0xFF)
        printf("Exit status: %d, exit code: %d\n", status, code)
    }
}'
ls: cannot access '/non/existing/path': No such file or directory

Linux
  1. Subscription-Manager:Befehl nicht gefunden

  2. dnf:Befehl nicht gefunden

  3. bc:Befehl nicht gefunden

  4. dpkg:Befehl nicht gefunden

  5. id:Befehl nicht gefunden

Awk-Befehl unter Linux

nc:Befehl nicht gefunden

aws-shell:Befehl nicht gefunden

awk:Befehl nicht gefunden

Wie erhalte ich den Exit-Status eines Shell-Befehls, der in GNU Makefile verwendet wird?

Wie bekomme ich den GNU-Bildschirm dazu, nicht in meinem Home-Verzeichnis in OS X zu starten?