GNU/Linux >> Tutoriels Linux >  >> Linux

Gnu Awk Errno n'est pas défini en cas d'échec de la commande ?

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

Linux
  1. gestionnaire d'abonnement :commande introuvable

  2. dnf :commande introuvable

  3. bc :commande introuvable

  4. dpkg :commande introuvable

  5. id :commande introuvable

Commande Awk sous Linux

Substitution de commande :fractionnement sur une nouvelle ligne mais pas sur un espace ?

nc :commande introuvable

aws-shell :commande introuvable

awk :commande introuvable

Comment faire en sorte que l'écran GNU ne démarre pas dans mon répertoire personnel sous OS X ?