`-V`标志如何既是`--verbose`又是`--version`?

时间:2018-05-14 18:38:46

标签: c flags getopt

来自https://github.com/karelzak/util-linux/blob/master/disk-utils/mkfs.c#L94-L113

/* Check commandline options. */
opterr = 0;
while ((more == 0)
       && ((i = getopt_long(argc, argv, "Vt:h", longopts, NULL))
       != -1))
    switch (i) {
    case 'V':
        verbose++;
        break;
    case 't':
        fstype = optarg;
        break;
    case 'h':
        usage();
    case VERSION_OPTION:
        print_version();
    default:
        optind--;
        more = 1;
        break;  /* start of specific arguments */

mkfs的文档说-V是版本和详细的短标志。我很难理解这是怎么可能的,我正在寻找清晰度。

VERSION_OPTION定义为enum { VERSION_OPTION = CHAR_MAX + 1 };所以我不确定是什么字符。

1 个答案:

答案 0 :(得分:9)

查看几行。在致电getopt_long之前:

    if (argc == 2 && !strcmp(argv[1], "-V"))
            print_version();

对于具有值-V的单个参数,代码具有特殊情况,而不是由正常选项处理代码处理。如果有多个参数,则if会将-V作为verbose标记处理。

这样做的一个影响是

mkfs -V -V

输出错误信息:

mkfs: no device specified
Try 'mkfs --help' for more information.

在手册页的(某些版本)中也注明了这一点:

  

<强> -V, --version

     

显示版本信息并退出。 (选项 -V 仅在唯一参数时显示版本信息,否则将以 --verbose 的形式显示。)