GNU/Linux >> Tutoriales Linux >  >> Linux

Gnu Awk Errno no configurado en falla de comando?

Estaba intentando ejecutar algunos comandos usando getline() función de GNU awk e imprima el número de error (errno ) valor devuelto. Pero para casos de falla simple de directorio/archivo inexistente, la variable no parece estar poblada.

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

Cuando lo anterior muestra la cadena de error de ls , el print declaración no produce un número de error válido. También intenté desde la página de manual usar PROCINFO["errno"] y PROCINFO["ERRNO"] que no funcionó. También intenté imprimirlo antes de cerrar el descriptor del archivo, que tampoco funcionó. ¿Está mal esperar ENOENT en este caso?

Respuesta aceptada:

No puede obtener el número de error usando getline . En su comando, la salida es de ls , no print result .

En forma cmd | getline result , cmd se ejecuta, luego su salida se canaliza a getline . Devuelve 1 si obtuvo salida, si EOF, -1 sobre el fracaso El problema es que la falla es por ejecutar getline en sí mismo, no el código de retorno de cmd . Ejemplo:

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

Verás que /etc/shadow no se puede leer, así que getline no se ejecuta y reporta el error en ERRNO variables.

Tenga en cuenta que GNU awk devolverá el cmd estado si no está en modo posix, por lo que puede hacer:

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

En el modo POSIX, no obtendrá el estado de salida:

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. administrador de suscripciones:comando no encontrado

  2. dnf:comando no encontrado

  3. bc:comando no encontrado

  4. dpkg:comando no encontrado

  5. id:comando no encontrado

Comando Awk en Linux

Sustitución de comandos:¿Dividir en nueva línea pero no en espacio?

nc:comando no encontrado

aws-shell:comando no encontrado

awk:comando no encontrado

¿Cómo obtener el estado de salida de un comando de shell utilizado en GNU Makefile?