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