Question

je me demande pourquoi optarg renvoie un chemin invalide dans le cas suivant : --foo=~/.bashrc mais pas si je laisse un espace entre les deux --foo ~/.bashrc.

Et quelle serait la solution de contournement pour que cela fonctionne dans les deux cas.

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

int main(int argc, char *argv[]) {
    int opt = 0;
    int long_index = 0;
    char *f; 
    static struct option longopt[] = { 
        {"foo", required_argument, 0,  'd' },
        {0,0,0,0}
    };  
    while ((opt = getopt_long(argc, argv,"d:", longopt, &long_index )) != -1) {
        switch (opt) {
            case 'd' : 
                printf("\n%s\n", optarg);
                f = realpath (optarg, NULL);
                if (f) printf("%s\n", f); 
                break;
            default: 
                exit(1);
        }   
    }   
    return 0;
}

Sortir:

$ ./a.out --foo=~/.bashrc
  ~/.bashrc

$ ./a.out --foo ~/.bashrc
  /home/user/.bashrc
Était-ce utile?

La solution

Cela se produit parce que "l'expansion du tilde" est effectuée par le shell :ce n'est pas un chemin valide en soi.Le tilde ~ est développé en tant que répertoire personnel uniquement s'il se trouve au début d'un argument de chaîne, cela ressemble à un chemin.Par exemple:

$ echo ~
/home/sigi
$ echo ~/a
/home/sigi/a
$ echo ~root/a
/root/a
$ echo ~a
~a
$ echo a/~
a/~

Si vous souhaitez également proposer cette fonctionnalité dans le premier cas, lorsque le shell ne peut pas vous aider, ou plus généralement pour les extensions de mots utilisées par le shell, vous pouvez trouver toutes les informations nécessaires pour le faire vous-même dans cette référence.

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