Ungültiger Dateipfad mit getopt_long in C
-
26-12-2019 - |
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
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.