遵循命令时双破折号会做什么?

时间:2014-10-09 15:30:11

标签: linux bash

问题:

在双击之后有一个命令时应用程序应如何解析命令行? (不重复thisthis

我知道双击通常会做什么:

  

A - 表示选项结束并禁用其他选项   处理。 - 之后的任何论据都被视为文件 -   名称和参数。 - 的参数等同于 -

因此它将以下内容设置为参数,例如: myapp -f <args> ...然后$ myapp -f -- -a -b会将-a-b视为-f的参数,而不是标志

但是当应用需要时会发生什么:

myapp cmd <arg> -f <args>...

命令行是$ myapp -f -- test cmd sth,它应解析为:

  • myapp收到-f标记,其中包含参数testcmdsth
  • myapp收到cmd命令后跟sth-f参数test

我正在为python编写命令行解析器,所以我需要知道它应该如何表现。

很多:)

4 个答案:

答案 0 :(得分:3)

你写了

  

$ myapp -f -- -a -b会将-a和-b视为-f的参数,而不是Flags

不完全。双击法为-a提供-bmyapp个参数。如果-f期望参数,则使用双破折号会引发错误,因为没有给出这样的参数。

如果您的解析器定义了一个子解析器,那么它之前的任何选项都被假定为主解析器定义的选项,子命令后面的任何选项都是子解析器的一部分。例如,使用

p = ArgumentParser()
p.add_argument("-v", action='store_true')
sp = p.add_subparsers()
p1 = sp.add_parser('cmd')
p1.add_argument('-v')

命令行myapp -v cmd -v test会以不同方式处理这两个-v;第一个是store_true上定义的p选项,第二个是p1上定义的选项。你的命令行

myapp -f -- test cmd sth
如果-f需要参数,

会产生错误。如果-f没有,则myapp只有一个选项-f和3个位置参数testcmdsth

答案 1 :(得分:1)

由于myapp -f -- test cmd sth中没有其他参数以连字符开头,因此该命令与myapp -f test cmd sth之间没有语义差异。所以无论那个命令做什么,前一个命令都可以。

答案 2 :(得分:1)

  

-的参数等同于--

您是从某些权威参考中引用此信息还是您自己的解释?因为许多程序将单个-视为标准输入/输出的特殊文件名。所以,例如在

$ diff - somefile

-表示“从标准输入读取第一个文件”,而

$ diff -- -o somefile

表示“从笨拙命名的文件-o中读取第一个文件”。如果我们想要将标准输入读取的文件与-o进行比较,则命令为

$ diff - -- -o

相当于

$ diff -- - -o

但仅限于您未应用您引用的规则。

  

但是当应用需要时会发生什么:

myapp cmd <arg> -f <args>...

我认为首先是一个有问题的设计,因为通常情况下,选项应该在位置参数之前进行。虽然它们可能是混合的,如果这是明确的,这在这里似乎不是。

您的示例的其余部分对我来说并不完全清楚(您是否忘记在示例中列出cmd?)但似乎问题的来源是接受多个可变长度的参数列表。在这里,它们是直接参数还是主程序并不重要。接受此类选项的程序通常必须引入自己的语法来消除命令行的歧义。例如,-exec程序的find选项使用;终止其参数列表。另一个技巧是要求用户将参数作为一个标记传递,并用特殊字符分隔它们。例如,-o程序的mount选项接受以逗号分隔的参数列表作为一个标记传递给程序。

  

我正在为python编写命令行解析器,所以我需要知道它应该如何表现。

只是为了确定:您是否从标准库中发现了argparse模块?

答案 3 :(得分:0)

应用程序可以随意解释如何解释命令行参数。大多数开发人员都遵守一些惯例 - 但有些则没有。阅读命令的文档