2014-10-09 104 views
2

问题:在执行命令后,double-dash会执行什么操作?

在双击破折号后有一个命令时,应用程序如何解析命令行? (不重复的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,带有参数test

我正在写一个命令行解析器-f对于python,所以我需要知道它应该如何表现。

THX很多:)

回答

1

由于没有任何的附加参数在myapp -f -- test cmd sth开始用连字号,有该命令和myapp -f test cmd sth之间没有语义差别。所以无论命令如何,前面的一个也是如此。

+1

不完全;如果'-f'需要一个参数,那么第一个会产生一个错误,第二个使用'test'作为'-f'的参数。 – chepner 2014-10-09 19:22:08

1

-一种说法是等效于--

你是从一些权威性的引用引用这个,还是这是你自己的解释?因为许多程序将单个-视为标准输入/输出的特殊文件名。因此,例如在

$ diff - somefile 

-的意思是“从标准输入读取的第一个文件”,而

$ diff -- -o somefile 

意味着“读从笨拙地命名的文件-o的第一个文件”。如果我们想比较从-o标准输入读取一个文件,该命令将

$ diff - -- -o 

这相当于

$ diff -- - -o 

但只有当你不应用你引用的规则。

但会发生什么时,需要一个应用程序:

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

我认为首先有问题的设计,因为通常情况下,选择应该定位参数之前去。尽管如果这是明确的,它们可能会混杂在一起,但这似乎并不是这样。

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

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

可以肯定的是:您是否从标准库中发现了​​模块?

0

应用程序可以自由地了解如何解释命令行参数。大多数开发者都遵守一些约定 - 但有些则不是。阅读文档的命令

3

你写

$ myapp -f -- -a -b将把-a和-b作为-f的参数,而不是旗帜

不太。双破折号使得-a-b参数变为myapp。如果-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不同;第一个是在p上定义的store_true选项,第二个是在p1上定义的选项。您的命令行

myapp -f -- test cmd sth 

如果-f需要参数会产生错误。如果-f不是,则myapp只是一个选项-f和3个位置参数test,cmdsth