Question

Comment puis-je obtenir l'option -10 de la ligne de commande arguments- " tail -10 ". fonction getopt trouve '1' caractère. Mais comment puis-je accéder à la chaîne "10" ?

Si cela peut être fait par getopt_long, un exemple aiderait. Merci.

Était-ce utile?

La solution

Sauf si vous avez l'intention de -1 être une option avec 0 comme argument, la réponse est que vous ne le faites pas. getopt est uniquement fait pour les options de traitement qui correspondent à la syntaxe standard option utilitaires POSIX. Il peut être possible d'utiliser GNU getopt_long à cette fin, ou vous pouvez simplement écrire votre propre analyseur argv (il est facile).

Edit: En fait, je pense que je mal lu ce que vous voulez. Si vous voulez - suivi d'un numéro à être interprété comme une option avec cette valeur numérique, je ne pense pas qu'il y ait une version de getopt qui fonctionne. Il n'y a aucun moyen que vous pouvez-cas spécial chaque numéro unique en option, et si vous dites simplement getopt que tous les chiffres sont des caractères d'option qui prennent des arguments, -123 sera interprété comme une option -1 avec un argument de 23 (ce qui est bien , vous pouvez l'interpréter à partir de là), mais un seul -1 forcerai l'élément suivant argv pour obtenir eaten comme argument de -1, ce qui est difficile, voire impossible à récupérer.

Autres conseils

Qu'est-ce qui se passe ici est que c la langue est livré avec absolument pas de norme de la bonne façon de gérer les options de ligne de commande.

Par ailleurs, le monde unix avait pas une telle norme depuis un certain temps (croire qu'il ya toute une section à ce sujet dans la section Unix Haters Handbook (lien PDF) ).

Donc, les gens ont écrit ad hoc mécanismes de traitement. Ceux-ci finalement évolué vers un commun (ish) standard et getopt est né (dans les laboratoires de Bell). Plus tard, nous avons eu la getopt GNU et getopt_long. Ceux-ci ne sont pas nécessaires, cependant, et certains programmes gèrent encore les choses à leur façon.

Mais avant que les choses se sont installés (et parfois après), les gens ont ajouté de nouvelles fonctionnalités à la façon « habituelle » des options de gestion lorsque ils semblaient être une bonne idée. Maintenant, il est un pari assez bon que tail voudra avoir le nombre de lignes plus souvent ajustées que toute autre caractéristique, ce qui en fait facile et quelques touches pour ajuster doit avoir semblé être une bonne idée à l'époque ...

Je n'ai jamais comme getopt beaucoup, donc je l'ai fait la chose habituelle et a réinventé la roue. J'appelle ma solution argopt. Vous pouvez obtenir la source et la page de manuel https://github.com/colding/argopt . Il est, je pense, beaucoup plus facile à utiliser que getopt.

Lorsque cela est possible, je recommanderais de changer la syntaxe des arguments de commande pour éviter les arguments numériques, que ce soit en passant le nombre comme argument d'option (par exemple -n -5) ou permettant seulement après le séparateur option --.

Pour les cas où l'évolution de la syntaxe des arguments est impossible, le BUGS section de la page homme getopt (3) BSD documents une façon de le faire. J'ai ajusté leur solution pour éviter optreset, qui est non spécifiée par POSIX et pas pris en charge par la glibc :

int ch;
long num;
char *numarg;

while ((ch = getopt(argc, argv, "0123456789")) != -1) {
    switch (ch) {
    case '0': case '1': case '2': case '3': case '4':
    case '5': case '6': case '7': case '8': case '9':
        numarg = argv[optind - 1];
        if (numarg[0] == '-' && numarg[1] == ch && numarg[2] == '\0') {
            num = '0' - ch;
        } else if ((numarg = argv[optind]) != NULL && numarg[1] == ch) {
            char *ep;
            int numoptind = optind;

            num = strtol(numarg, &ep, 10);
            if (*ep != '\0') {
                fprintf(stderr, "illegal number -- %s\n", numarg);
                return EXIT_FAILURE;
            }

            /* Advance getopt internal state to next argument. */
            while (optind == numoptind) {
                ch = getopt(argc, argv, "0123456789");
                assert(ch >= '0' && ch <= '9');
            }
        } else {
            fprintf(stderr, "number after other options -- %s\n", numarg);
            return EXIT_FAILURE;
        }
        break;

    default:
        /* Unrecognized option character.  Error printed by getopt. */
        return EXIT_FAILURE;
    }
}

Vous pouvez remplacer getopt avec getopt_long et ajouter des options à court ou plus longtemps que nécessaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top