Frage

Ich frage mich warum optarg gibt im folgenden Fall einen ungültigen Pfad zurück: --foo=~/.bashrc aber nicht, wenn ich dazwischen einen Raum lasse --foo ~/.bashrc.

Und was wäre die Problemumgehung, damit es in beiden Fällen funktioniert.

#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;
}

Ausgabe:

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

$ ./a.out --foo ~/.bashrc
  /home/user/.bashrc
War es hilfreich?

Lösung

Dies geschieht, weil die "Tilde-Erweiterung" von der Shell ausgeführt wird:es ist kein gültiger Pfad für sich.Die Tilde ~ wird nur dann als Heimatverzeichnis erweitert, wenn sie sich am Anfang eines Zeichenfolgenarguments befindet, das wie ein Pfad aussieht.Beispielsweise:

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

Wenn Sie diese Funktionalität auch im ersten Fall anbieten möchten, in dem die Shell Ihnen nicht helfen kann, oder allgemeiner die von der Shell verwendeten Worterweiterungen, finden Sie alle erforderlichen Informationen, um dies selbst zu tun in diese Referenz.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top