这让我抓狂了一段时间,因为它之前在 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()
被新标准重新定义了吗?
我是不是漏掉了什么??
被新标准重新定义了吗?getopt()
不。您所描述的是 GNU 实现
getopt()
的长期行为,这是您在大多数 Linux 发行版中都会得到的:
默认情况下,
在扫描时会排列getopt()
的内容,因此 最终所有的非选择都结束了。另外两个扫描 模式也被实施。如果 optstring 的第一个字符是 '+' 或设置环境变量argv
,然后选项 一旦遇到非选项参数,处理就会停止。 [...]POSIXLY_CORRECT
POSIXLY_CORRECT
环境变量也修改了许多其他 GNU 软件的行为,以禁用 GNU 扩展和/或更改行为以更符合 POSIX。您可能习惯在默认设置的环境中工作。显然,它不是设置在你现在工作的环境中。