getopt() C 函数在 Ubuntu 23.10 中无法正常工作

问题描述 投票:0回答:1

这让我抓狂了一段时间,因为它之前在 Ubuntu 上运行得很好,直到我升级到 Ubuntu 23.10。我在 C 中调用

getopt()
函数,没有任何循环,并且只在程序中调用一次,并且它总是扫描过去的非选项值。我写了一个最小的可重现问题

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  int opt = getopt(argc, (char **)argv, "hdeb:vg:wc:-");
  printf("Opt = %d, %d\n", opt, optind);
  return 0;
}

当用程序调用

program -d test
时,会打印出:

Opt = 100, 2

看起来不错,因为它找到选项的最后一个索引是 1。

但是,当我用 as

program test -d
调用它时,故意将选项放在非选项参数之后,根据文档,该选项应该停止扫描非选项参数,直到我再次调用
getopt()
,它输出:

Opt = 100, 3

预期输出是:

Opt = 100, 2

我用

program test test2 test3 -d
进一步测试,输出是:

Opt = 100, 5

如您所见,

getopt()
不断扫描非选项参数,就像是否存在某种内部自动循环一样。

我是不是漏掉了什么??

getopt()
被新标准重新定义了吗?

c++ c getopt
1个回答
0
投票

我是不是漏掉了什么??

getopt()
被新标准重新定义了吗?

不。您所描述的是 GNU 实现

getopt()
的长期行为,这是您在大多数 Linux 发行版中都会得到的:

默认情况下,

getopt()
在扫描时会排列
argv
的内容,因此 最终所有的非选择都结束了。另外两个扫描 模式也被实施。如果 optstring 的第一个字符是 '+' 或设置环境变量
POSIXLY_CORRECT
,然后选项 一旦遇到非选项参数,处理就会停止。 [...]

POSIXLY_CORRECT
环境变量也修改了许多其他 GNU 软件的行为,以禁用 GNU 扩展和/或更改行为以更符合 POSIX。您可能习惯在默认设置的环境中工作。显然,它不是设置在你现在工作的环境中。

© www.soinside.com 2019 - 2024. All rights reserved.