Почему эта строка документа не работает с необязательными аргументами или без них? - PullRequest
1 голос
/ 14 мая 2019

Вот полная строка документа, которую я использовал:

foo.

Usage:
    foo [options] <file> -o <output>
    foo --help | --version

Options:
    -h, --help          print this help message.
    --target <target>   target.
    --version           print the version.

В соответствии с официальным синтаксическим анализатором , foo a -o b или foo --target abc a -o b проанализированы неправильно.Какие могут быть возможные причины для этого случая?Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Я не совсем уверен насчет разрешенных комбинаций опций для вашего скрипта, но вот что-то, что должно быть близко.

Просто для забавы, я написал скрипт, который имеет подобные опции для вашей проверки этогос последними документами .

Мне было проще всего написать [options] в главном разделе использования, и у меня есть все варианты, приведенные ниже, в качестве альтернативы, без особых комбинаций.

Я нахожусь на macOS, поэтому яЯ использую Bash 3.2 (с исправлениями docopts.sh, чтобы исправить некоторые проблемы Mac).Вы можете избежать некоторого кода в этом скрипте, если вы используете bash 4.x - см. Закомментированный раздел с опцией --auto и функцией docopt_print_ARGS.В настоящее время вам потребуется bash 4.x, чтобы избежать исправления docopts.sh.

#!/bin/bash
#
# foo.
#
# Usage:
#     foo [options] <file>
#     foo --help | --version
#
# Options:
#     -t, --target <target>   target.
#     -o, --output <output>   output.
#     -h, --help              print this help message.
#     --version               print the version.
#

# bash 3.2 (patched docopts.sh) - include set -x to see the args easily
source docopts.sh
usage=$(docopt_get_help_string "$0")
set -x
eval "$(docopts -G ARGS -V "$VERSION" -h "$usage" : "$@")"

# On bash 4.x, replace preceding section with this, or use -A instead of -G above
# source docopts.sh --auto "$@"
# docopt_print_ARGS

. Он анализирует раздел «Использование» и обрабатывает такие командные строки, как:

foo --target a -o b file1
foo --target a --output b file1
foo --target a file1

Частичный вывод с set -x чтобы показать правильно обработанные аргументы:

$ ./foo --target a file1 --output b
...
++ ARGS_target=a
++ ARGS_output=b
++ ARGS_file=file1
++ ARGS_help=false
++ ARGS_version=false
0 голосов
/ 18 мая 2019

Спасибо за усилия @ RichVel. Вчера я наконец выяснил причину (глупую) причину этой проблемы.

В официальном онлайн-парсере первая часть, т.е. foo не должна использоваться. --target abc a -o b отлично работает в онлайн-примере.

Что касается моего вопроса, то ошибка на самом деле происходит из-за того, что docopt.rs хранит --target abc в flag_target вместо arg_target.

...