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