Parsing details
During parsing, parse_args
must determine whether an argument is an option, an option argument, a positional argument, or a command. The general rules are explained in the parse_args
documentation, but ambiguities may arise under particular circumstances. In particular, negative numbers like -1
or -.1e5
may look like options. Under the default settings, such options are forbidden, and therefore those tokens are always recognized as non-options. However, if the allow_ambiguous_opts
general setting is true
, existing options in the argument table will take precedence: for example, if the option -1
is added, and it takes an argument, then -123
will be parsed as that option, and 23
will be its argument.
Some ambiguities still remains though, because the ArgParse
module can actually accept and parse expressions, not only numbers (although this is not the default), and therefore one may try to pass arguments like -e
or -pi
; in that case, these will always be at risk of being recognized as options. The easiest workaround is to put them in parentheses, e.g. (-e)
.
When an option is declared to accept a fixed positive number of arguments or the remainder of the command line (i.e. if nargs
is a non-zero number, or 'A'
, or 'R'
), parse_args
will not try to check if the argument(s) looks like an option.
If nargs
is one of '?'
or '*'
or '+'
, then parse_args
will take in only arguments which do not look like options.
When nargs
is '+'
or '*'
and an option is being parsed, then using the '='
character will mark what follows as an argument (i.e. not an option); all which follows goes under the rules explained above. The same is true when short option groups are being parsed. For example, if the option in question is -x
, then both -y -x=-2 4 -y
and -yx-2 4 -y
will parse "-2"
and "4"
as the arguments of -x
.
Finally, note that with the eval_arg
setting expressions are evaluated during parsing, which means that there is no safeguard against passing things like run(`rm -rf someimportantthing`)
and seeing your data evaporate (don't try that!). Be careful and generally try to avoid using the eval_arg
setting.