Неверный путь к файлу с использованием GetOPT_LONG в C

StackOverflow https://stackoverflow.com//questions/21065946

  •  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/~
.

Если вы хотите предложить эту функциональность в первом случае, в том случае, если оболочка не может помочь вам или в целом, расширения слов, которые используются оболочкой, вы можете найти всю необходимую информацию, чтобы сделать это самостоятельно в Эта ссылка .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top