为什么带有或不带有可选args的docopt字符串都不起作用?

时间:2019-05-14 07:24:59

标签: docopt

这是我使用的完整docopt字符串:

foo.

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

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

根据the official parserfoo a -o bfoo --target abc a -o b未正确解析。这种情况可能是什么原因?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我不确定您的脚本所允许的选项组合,但这应该是可以解决的。

只是为了好玩,我编写了一个脚本,该脚本具有与您相似的选项,可以使用最新的docopts进行测试。

我发现在“用法”主要部分只写[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进行部分输出以显示正确处理的args:

$ ./foo --target a file1 --output b
...
++ ARGS_target=a
++ ARGS_output=b
++ ARGS_file=file1
++ ARGS_help=false
++ ARGS_version=false

答案 1 :(得分:0)

感谢@RichVel的努力。昨天我终于找到了导致此问题的根本原因(愚蠢)。

在官方的在线分析器中,不应使用第一部分,即foo--target abc a -o b在在线示例中效果很好。

关于我的问题,该错误实际上来自docopt.rs将--target abc存储在flag_target中而不是arg_target中。