在C中使用getopt_long的文件路径无效

时间:2014-01-11 18:08:29

标签: c path getopt-long

我想知道为什么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

1 个答案:

答案 0 :(得分:1)

这是因为“波浪扩展”由shell执行:它本身不是有效路径。 tilde~作为主目录扩展,以防它位于字符串参数的开头,看起来像路径。例如:

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

如果您想在第一种情况下提供此功能,shell无法帮助您,或者更常见的是shell使用的单词扩展,您可以找到自己执行的所有必需信息this reference