GNU/Linux >> Linux Esercitazione >  >> Linux

Gnu Awk Errno non è impostato su comando non riuscito?

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

Linux
  1. Sostituzione del comando:divisione su una nuova riga ma non nello spazio?

  2. ifrename:comando non trovato

  3. ln:comando non trovato

  4. awk:comando non trovato

  5. Come ottenere lo stato di uscita di un comando shell utilizzato in GNU Makefile?

Comando Awk in Linux

aws-shell:comando non trovato

df:comando non trovato

du:comando non trovato

rm:comando non trovato

mv:comando non trovato