这是我使用的完整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 parser,foo a -o b
或foo --target abc a -o b
未正确解析。这种情况可能是什么原因?任何帮助将不胜感激。
答案 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
中。