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