Stavo provando a eseguire alcuni comandi usando getline()
funzione di GNU awk
e stampa il numero di errore (errno
) valore restituito. Ma per semplici casi di errore di directory/file inesistenti, la variabile non sembra essere popolata.
awk 'BEGIN {
cmd = "ls -lrth /non/existing/path"
while ( ( cmd | getline result ) > 0 ) {
print result
}
close(cmd); print ENVIRON["ERRNO"]
}'
Quando quanto sopra emette la stringa di errore da ls
, il print
l'istruzione non produce un numero di errore valido. Ho anche provato dalla pagina man a usare PROCINFO["errno"]
e PROCINFO["ERRNO"]
che non ha funzionato. Ho anche provato a stamparlo prima di chiudere il descrittore di file che non funzionava. È sbagliato aspettarsi ENOENT
in questo caso?
Risposta accettata:
Non è possibile ottenere il numero di errore utilizzando getline
. Nel tuo comando, l'output è da ls
, non print result
.
Nella forma cmd | getline result
, cmd
viene eseguito, quindi il suo output viene reindirizzato a getline
. Restituisce 1
se ottenuto output, se EOF,
-1
sul fallimento. Il problema è che l'errore è dovuto all'esecuzione di getline
stesso, non il codice di ritorno di cmd
. Esempio:
awk 'BEGIN {
while ( ( getline result < "/etc/shadow") > 0 ) {
print result
}
print "XXX: ", ERRNO
}'
XXX: Permission denied
Vedrai quel /etc/shadow
non può essere letto, quindi getline
non viene eseguito e segnala l'errore in ERRNO
variabile.
Nota che GNU awk restituirà il cmd
stato se non in modalità posix, quindi puoi fare:
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
In modalità POSIX, non otterrai lo stato di uscita:
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