Eu estava tentando executar alguns comandos usando getline()
a função do GNU awk
e imprimir o errno
valor do número do erro ( ) retornado. Mas para casos de falha simples de diretório/arquivo inexistente, a variável não parece ser preenchida.
awk 'BEGIN {
cmd = "ls -lrth /non/existing/path"
while ( ( cmd | getline result ) > 0 ) {
print result
}
close(cmd); print ENVIRON["ERRNO"]
}'
Quando o acima coloca a string de erro de ls
, a print
instrução não produz um número de erro válido. Eu também tentei usar a página manPROCINFO["errno"]
e PROCINFO["ERRNO"]
não funcionou. Eu também tentei imprimi-lo antes de fechar o descritor de arquivo que também não funcionou. É errado esperar ENOENT
neste caso?
Você não pode obter o número do erro usando
getline
. Em seu comando, a saída é dels
, não deprint result
.Em form
cmd | getline result
,cmd
é executado, então sua saída é canalizada paragetline
. Ele retorna1
se obteve saída,0
se EOF,-1
em caso de falha. O problema é que a falha é dagetline
própria execução, não do código de retorno docmd
. Exemplo:Você verá que
/etc/shadow
não pode ser lido, entãogetline
falha ao executar e reporta o erro naERRNO
variável.Observe que o GNU awk retornará o
cmd
status se não estiver no modo posix, então você pode fazer:No modo POSIX, você não obterá o status de saída:
ERRNO só será definido pelo gawk ( somente GNU awk ) se o getline ou close falhar, mas ele conseguir ler a saída (vazia!) de ls. Essa saída está vazia, porque ls fornece uma mensagem de erro ("ls: não pode acessar ...") no canal de erro padrão, não grava nada na saída padrão e existe com um código de erro.
Com GNU awk você pode obter o status de saída do comando assim:
Se você precisar da mensagem de erro do comando, você deve redirecionar seu canal de erro padrão para algum arquivo e ler isso: