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