Как заставить getopt пропустить имя программы и имя скрипта перед обработкой аргументов?

Думаю, я пытаюсь придумать, как устроить так, чтобы getopt_long пропускал аргумент.

Я написал общую библиотеку / dll и использую ее из C или из lua-скрипта. Часть кода, которая анализирует CLI, находится в общей библиотеке/dll, которая находится на языке C (см. ниже). Я могу получить доступ к argc и argv из файла общей библиотеки/dll на языке C.

Когда я запускаю свою программу, это может быть одно из:

$ my_c_app --buddy moe --buddy larry --buddy curly

$ interpreter my_script.scr --buddy moe --buddy larry --buddy curly

Когда я разбираю из my_c_app, все работает нормально. Но когда я передаю argc и argv из сценария lua, все идет наперекосяк.

Я думаю, что это спотыкается, потому что все начинается с lua my_script.lua. Я думаю, что эту часть нужно пропустить (он же рассматривает два термина как имя стартовой программы)

Вот код разбора:

static struct option long_options[] = {
    {"buddy", required_argument, NULL, 'b'},
    {"version", optional_argument, NULL, 'v'},
    {NULL, 0, NULL, 0}
};

void parse_cli(int argc, char *const *argv)
{
    char ch;

    // show me what you see
    for (int i = 0; i < argc; i++) {
        printf("%s\n", argv[i]);
    }

    print("--------\n");

    while ((ch = getopt_long(argc, argv, "p:v:", long_options, NULL)) != -1) {
        switch (ch) {
        case 'b':
            printf("buddy %s\n", optarg);
            break;
        case 'v':
            printf("version 1.0\n");
        default:
            break;
        }
    }
}

Вот что вы видите:

работает

$ my_c_app --buddy moe --buddy larry --buddy curly
my_c_app
--buddy
moe
--buddy
larry
--buddy
curly
--------
moe
larry
curly

не удается

interpreter
my_script.scr
--buddy
moe
--buddy
larry
--buddy
curly
--------
(null)
(null)
(null)

ПРИМЕЧАНИЯ:

  • Я экспериментировал с установкой optind на разные значения, нет.
  • Мой интерпретатор действительно lua.
  • Я не думаю, что это lua вещь. Это может быть python my_script.py

person 010110110101    schedule 31.07.2020    source источник


Ответы (1)


Быстрое исправление, которое вы можете сделать, это проверить, существует ли argv[1] и не начинается ли оно с -. Если это так, начните парсинг с argv + 1.

void parse_cli(int argc, char *const *argv)
{
    if (argc > 1 && argv[1][0] != '-') {
        argv++;
        argc--;
    }
    ...
person dbush    schedule 31.07.2020
comment
Это решение вызывает у меня некоторые проблемы, когда я использую optarg. Он больше не всегда равен значению аргумента. Я экспериментировал с argv[optind], который также вел себя непоследовательно между двумя способами запуска моего приложения. - person 010110110101; 31.07.2020