【问题标题】:How to allow non-option arguments in any order to getopt?如何允许以任何顺序获取非选项参数?
【发布时间】:2012-11-08 14:19:13
【问题描述】:

我有一个 C 程序,它期望使用多个选项和 1 个非选项参数(即没有关联的选项字母)调用,并使用 getopt 解析这些选项。例如,它可以被调用:

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

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

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

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

我已阅读 getopt 手册页,发现这可能是相关的:

如果 optstring 的第一个字符是 '+' 或设置了环境变量 POSIXLY_CORRECT,则一旦遇到非选项参数,选项处理就会停止。

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

【问题讨论】:

  • 在终端(unix 等)上输入 set 以查看是否设置了 POSIXLY_CORRECT,也许?
  • $ set | grep "POSIXLY_CORRECT" 没有返回任何东西,所以可能没有设置。
  • 也许POSIX_ME_HARDER仍在使用中?
  • 您确定您的来源明确包含了getopt.h 吗?
  • @WilliamMorris:envset 更好地检查环境。

标签: c getopt


【解决方案1】:

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

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

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

【讨论】:

  • 为微不足道的编辑道歉 - 只有这样我才能删除我意外的反对票(并将其变成赞成票)。
猜你喜欢
  • 2018-05-04
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
相关资源
最近更新 更多