【问题标题】:What does double-dash do when following a command?执行命令时双破折号有什么作用?
【发布时间】:2014-10-09 15:30:10
【问题描述】:

问题:

当双破折号后有一个命令时,应用程序应该如何解析命令行? (thisthis不重复)

我知道双破折号通常会做什么:

A -- 表示选项结束并禁用更多选项 加工。 -- 之后的任何参数都被视为文件- 名称和论据。 - 的参数等价于 --

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

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

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

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

  • myapp 收到带有参数 testcmdsth-f 标志
  • myapp收到cmd命令后跟sth-f带参数test

我正在为 python 编写一个命令行解析器,所以我需要知道它的行为方式。

非常感谢:)

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    你写的

    $ 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 个位置参数testcmdsth

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 不完全;如果-f 需要一个参数,那么第一个产生错误,第二个使用test 作为-f 的参数。
      【解决方案3】:

      - 的参数等价于--

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

      $ diff - somefile
      

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

      $ diff -- -o somefile
      

      的意思是“从名字尴尬的文件-o 中读取第一个文件”。如果我们想比较从标准输入读取的文件和-o,命令是

      $ diff - -- -o
      

      相当于

      $ diff -- - -o
      

      但前提是你没有应用你引用的规则。

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

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

      我首先会认为这是一个有问题的设计,因为通常,选项应该放在位置参数之前。尽管如果这是明确的,它们可能会混合在一起,但这里似乎不是。

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

      我正在为 python 编写一个命令行解析器,所以我需要知道它的行为方式。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-05
          相关资源
          最近更新 更多