getopt(3)在mac os和CentOS上

时间:2014-05-13 11:48:16

标签: c macos centos getopt

我在OSX和CentOS上用gcc编译相同的代码:

while (( opt = getopt (argc, argv, "hp:" )) != -1 )
    {
        fprintf (stderr,"+++++++++++ %d\n\n", opt );
        switch ( opt )
            {
            case 'h':
                    fprintf(stderr, "Help Page \n %s", help_str);
                    return 1;

            case 'p':
                    filename = optarg ;
                    fprintf(stderr,"================== %s\n",optarg);
                    break;

            case '?':
                    printf("ZHZHZHZHZHUT\n");
                    return 3;

            default:
                break;
            }
    }

然后我尝试运行./a.out -p ./file.txt ya.ru./a.out ya.ru -p ./file.txt 在CentOS 6.5上,两种变体都有效。

但是在MAC OS X(10.9)变体./a.out ya.ru -p ./file.txt(依赖参数之前的自由参数)不起作用。 -p/file.txt用作简单参数(不是getopt)。

完整代码为here

感谢。

1 个答案:

答案 0 :(得分:4)

GNU getopt()的{​​{3}}行为是仅在处于POSIX模式时停在第一个非选项参数,可以通过选项开头的+设置字符串或设置POSIXLY_CORRECT环境变量。

在默认模式下,GNU getopt()'会在扫描时置换argv的内容,因此最终所有非选项都在最后。'

你在行为中遇到了这种差异 - 这是GNU getopt()和BSD getopt()行为之间的区别,因为BSD getopt()具有POSIX语义。