Неверный путь к файлу с использованием GetOPT_LONG в C
-
26-12-2019 - |
Вопрос
Мне интересно, почему optarg
возвращает неверный путь в следующем случае: --foo=~/.bashrc
, но не если я оставляю место между --foo ~/.bashrc
.
А каким будет обходной путь, поэтому он работает на обоих случаях.
#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;
}
.
<Сильные> Вывод:
$ ./a.out --foo=~/.bashrc
~/.bashrc
$ ./a.out --foo ~/.bashrc
/home/user/.bashrc
. Решение
Это происходит, потому что «расширение тильды» выполняется оболочкой: он не является действительным путем самостоятельно.Tilde ~ расширяется как домашний каталог только в случае, если он находится в начале строкового аргумента, это выглядит как путь.Например:
$ echo ~
/home/sigi
$ echo ~/a
/home/sigi/a
$ echo ~root/a
/root/a
$ echo ~a
~a
$ echo a/~
a/~
.
Если вы хотите предложить эту функциональность в первом случае, в том случае, если оболочка не может помочь вам или в целом, расширения слов, которые используются оболочкой, вы можете найти всю необходимую информацию, чтобы сделать это самостоятельно в Эта ссылка .