2017-10-03 19 views
0

J'ai des difficultés à trouver comment utiliser correctement la fonction glob().POSIX: glob() trouve seulement le premier match

Ceci est mon code simple test:

#include <glob.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    char *path; 
    if (argc > 1) { 
     path = argv[1]; 
    } else { 
     path = "/foo/bar/"; 
    } 
    glob_t pglob; 
    int glob_res = glob(path, 0, NULL, &pglob); 

    switch (glob_res) { 
    case GLOB_ABORTED: 
     printf("Glob failed: read error\n"); 
     break; 
    case GLOB_NOMATCH: 
     printf("Glob failed: no match\n"); 
     break; 
    case GLOB_NOSPACE: 
     printf("Glob failed: oom\n"); 
     break; 
    default: 
     printf("Matches: %lu\n", pglob.gl_pathc); 
     for (unsigned i = 0; i < pglob.gl_pathc; ++i) { 
      printf("%s\n", pglob.gl_pathv[i]); 
     } 
     break; 
    } 
    return 0; 
} 

Supposons que j'ai un répertoire comme celui-ci:

$ ls 
a b glob glob.c 

Je me attends un appel à ./glob * pour imprimer tous les 4 fichiers, mais il dit simplement moi sur le premier:

$ ./glob * 
Matches: 1 
a 

Quelle erreur de débutant stupide je fais?

+1

Le shell fait l'expansion avant que votre programme ne le voit, et vous ne traitez que le premier argument de la ligne de commande, qui dans ce cas serait ''a' ', c'est tout ce que vous voyez. –

+0

Le shell développe '*' que vous ne voulez pas. Exécuter comme './glob '*'' pour éviter l'expansion du shell. – usr

Répondre

2

Comme indiqué dans les commentaires: la coquille a déjà fait l'globbing:

./glob * a été résolu à ./glob a b glob glob.c et donc l'appel à la fonction glob() utilisé juste a comme modèle.

L'appel ./glob '*' a résolu le problème.