命令行选项样式-POSIX还是什么?


16

在某处,我看到有人反对使用Java和Javac混合使用Windows和Unix风格,

java -classpath ... -ea ... Something

恕我直言,这是没有关系的,就像find作品一样,不是吗?AFAIK,根据POSIX,语法应类似于

java --classpath ... --ea ... Something

-abcdef意味着一次指定6个简短选项。我不知道哪个版本通常导致更少的键入和更少的错误。

我正在用Java编写一个小型实用程序,在任何情况下都不会使用Windows风格,/a /b因为我主要对Unix感兴趣。我应该选择哪种风格?


1
POSIX 1003.1-2003,基本定义,第12章,第2节提供了有关实用程序命令行语法的以下准则:“每个选项名称应为可移植字符集中的单个字母数字字符(数字字符分类)。” 和“所有选项都应以'-'分隔符开头。”
格雷格·伍兹

Answers:


21

您可以在“ 实用程序约定”一章中找到POSIX参数约定。POSIX样式由带有单个破折号的选项组成,后跟一个表示该选项的单个字母,参数值与该选项之间用空格分隔。

规则有例外- find例如-但是这些是由于Unix历史的先例。

X Windows(X11)使用find- 类似的单破折号,长名称选项。

双破折号长名称选项由GNU提出(在绕道而行后+用作前缀)。

有关广泛已知的命令行参数处理系统的讨论,请参见此StackOverflow问题-有很多。(自编写此文档以来,可以确定SO 367309问题不适合SO的权力。我已经将答案转移到另一个问题,Unix shell命令的一般语法是什么?

您可以扩展技术列表以覆盖git(以及许多其他系统)获得以下结构的结构:

  • basecommand[ 全局选项 ] subcommand[ 子命令选项 ] [名称...]

可能有许多子命令,每个子命令都有其自己的选项词典。

当然,Windows使用(使用的)斜杠' /'表示选项,而不是破折号' -'。

JCL(用于z / OS,OS / 360和中间系统)倾向于使用由逗号分隔的位置参数,通常被认为不是用户友好或良好的界面。


1
+1对于漂亮的链接和提及git
maaartinus 2011年

我喜欢所有答案,由于链接而接受了这一答案。
maaartinus 2011年

stackoverflow问题似乎已被删除(或可能已移动)……有人知道它去了哪里吗?我很想读。
mizipzor 2012年

1
@mizipzor:请参阅更新以获取信息的当前位置。另请参见带有选项参数的短/长选项-这是某种约定吗?
乔纳森·勒夫勒

“当然,Windows使用(使用的)斜杠'/'表示选项,而不是破折号'-'。” 现在,大多数Windows命令行工具都支持这两种工具,而PowerShell正在仅使用破折号。
jpmc26 2016年

15

编辑:有人指出,这种风格是一种GNU风格,非基于GNU的Unix倾向于使用单破折号语法(特别是OS X和BSD变体)。

尽管它是GNU主义,但是许多新编写的Unix风格的程序仍使用这种风格:

  • --long-option 对于长选项名称,
  • -s 对于简短的(一个字符)选项,
  • -abc 用于多个不带参数的简短选项(每个选项一个字符)。
  • 带参数的选项:
    • --long arg--long=arg长选项,
    • -s arg-sarg或(可选)-s=arg表示简短选项。只要只有最后一个带有参数,就可以将其与其他短选项结合使用。
  • 相同的“语义”选项可以具有多个别名,最常见的是短别名(键入快捷键)和长别名(便于记忆)。

任何使用Linux Shell已有一段时间的人都应该熟悉这种样式1,因此它的原则是毫不奇怪。允许将多个短选项分组而不与长选项产生歧义也很不错。

1例如,一些使用这种风格(我的Linux机器上)的程序:lsgrepmansedbash,等。(编辑:这显然是GNU-主义虽然,BSD和OS X的机器不要用这种风格)

有迹象表明,可以解析此为你的照顾几个库(最知名的是GNU的实现getopt的),只需要你指定什么长期和短期的选项存在,无论他们采取一个参数,而要做到当什么找到选项。(当然,对于位置参数也要做什么,即不以开头-且不是先前选项的参数的位置参数)

find是一个非常老的程序(或更可能是:一个非常老的程序的重写版本),不能轻易更改为使用新的命令行语法。太多的脚本会中断,并且太多使用旧语法的用户会抱怨。javac可能受到gcc和朋友的影响,出于历史原因,他们也遵循旧语法。


+1-另外,当您有数百个选项时,您只需发挥创造力(例如,在编写编译器时)
Tim Post

1
您给人的印象是所有Unices都使用GNU utils(即dash-dash args),这是错误的。Mac OS X不支持它们,Free BSD也是如此。
Martin Wickman

8
  • 带有破折号(--long-arg)的参数是GNU约定(请参见其getopt实现)。
  • POSIX命令从不使用双破折号参数。这适用于Unix的大多数变体(Mac OS X,BSD),但默认情况下使用GNU的Linux除外。

对于您的Java项目,您可能需要检出JavaApache CLI的GNU getopt。它们支持两种约定。

第三种选择是使用Java VM参数,然后让运行时为您解析它们:

 $ java -Dcolor=blue

然后,在代码中:

 System.getProperty("color");

就我个人而言,我会使用该-D惯用法并将Java咒语包装在一个shell脚本中,该脚本处理命令行解析,包括检查类路径等。这也使本机用户可以更轻松地运行Java程序。


1

这取决于。我个人更喜欢POSIX风格,但是在您的情况下,我可能希望与要使用您的工具的环境保持一致。这意味着对JAR使用Java约定(除非您计划使用一个包装脚本,使其看起来像典型的Unix命令)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.