J'essayais d'exécuter quelques commandes en utilisant getline()
fonction de GNU awk
et imprimez le numéro d'erreur (errno
) valeur renvoyée. Mais pour les cas d'échec simples de répertoire/fichier inexistant, la variable ne semble pas être renseignée.
awk 'BEGIN {
cmd = "ls -lrth /non/existing/path"
while ( ( cmd | getline result ) > 0 ) {
print result
}
close(cmd); print ENVIRON["ERRNO"]
}'
Lorsque ce qui précède affiche la chaîne d'erreur de ls
, le print
l'instruction ne produit pas de numéro d'erreur valide. J'ai également essayé depuis la page de manuel d'utiliser PROCINFO["errno"]
et PROCINFO["ERRNO"]
qui n'a pas fonctionné. J'ai aussi essayé de l'imprimer avant de fermer le descripteur de fichier qui ne fonctionnait pas non plus. Est-il faux d'attendre ENOENT
dans ce cas ?
Réponse acceptée :
Vous ne pouvez pas obtenir le numéro d'erreur en utilisant getline
. Dans votre commande, la sortie provient de ls
, pas print result
.
Sous forme cmd | getline result
, cmd
est exécuté, sa sortie est redirigée vers getline
. Il renvoie 1
si la sortie est obtenue, si EOF,
-1
en cas d'échec. Le problème est que l'échec provient de l'exécution de getline
lui-même, pas le code de retour de cmd
. Exemple :
awk 'BEGIN {
while ( ( getline result < "/etc/shadow") > 0 ) {
print result
}
print "XXX: ", ERRNO
}'
XXX: Permission denied
Vous verrez que /etc/shadow
ne peut pas être lu, donc getline
ne s'exécute pas et signale l'erreur dans ERRNO
variables.
Notez que GNU awk renverra le cmd
statut s'il n'est pas en mode posix, vous pouvez donc faire :
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 mode POSIX, vous n'obtiendrez pas le statut de sortie :
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