Как флаг `-V` может быть одновременно` --verbose` и `--version`? - PullRequest
0 голосов
/ 14 мая 2018

С 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 голосов
/ 14 мая 2018

Посмотрите на несколько строк.Перед вызовом 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.)

...