如何允许任何顺序的非选项参数getopt?

时间:2012-11-08 14:19:14

标签: c getopt

我有一个C程序,期望用几个选项和一个非选项参数调用(即没有相关的选项字母),并使用getopt来解析这些选项。例如,可以通过以下方式调用它:

例1:     myProgram -a "aParam" -b "bParam" "xParam"

我一直在使用SLES10,这些选项可以按任何顺序运行。例如,非选项参数“xParam”可能首先出现:

例2:     myProgram "xParam" -a "aParam" -b "bParam"

但是,在SLES11中进行测试时,似乎getopt一旦到达非选项参数就会停止处理,因此上面的示例2不起作用。

我已经阅读了getopt手册页,看到这可能是相关的:

  

如果optstring的第一个字符是'+'或者设置了环境变量POSIXLY_CORRECT,那么只要遇到nonoption参数,选项处理就会停止。

我不确定SLES11默认是否设置POSIXLY_CORRECT。 在SLES11中获取旧SLES10 getopt行为的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

事实证明,默认情况下它会重定向到_posix_getopt(),这会导致我上面描述的行为。

我最终找到了可能的解决方案:

  1. 请改用getopt_long()。这似乎没有posix等价物。
  2. 定义_GNU_SOURCE,停止重定向。
  3. 可能使用包装器shell脚本手动重新排序参数。