Unix shell命令的一般语法是什么?

Laz*_*zer 10 unix sorting shell

特别是,为什么有时某些命令的选项前面有一个+符号,有时候是一个-符号?

例如:

sort -f
sort -nr
sort +4n
sort +3nr
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 21

目前,使用getopt()(又名getopt(3))POSIX标准被广泛用作标准符号,但在早期,人们正在进行实验.在某些计算机上,该sort命令不再支持该+表示法.然而,各种命令(特别是ar和tar)接受控制,没有任何前缀字符-和dd(在评论由阿洛克提到)共使用另一种约定.

使用' --'用于长选项(受支持getopt_long(3))的GNU约定已从使用' +' 更改.当然,X11软件在多字符选项之前使用单个破折号.因此,整个事物是一系列历史文物,因为人们试验了如何最好地处理它.

POSIX记录了它适用的实用程序约定,除非历史先例更强.


有哪些款式的期权处理?

[有一段时间,SO 367309包含以下材料作为我的答案.最初由FerranB询问2008-12-15 02:02 ,但随后被关闭并删除.]

您认识到多少种不同类型的选项?我能想到很多,包括:

  • 单字母选项前面有单个破折号,当没有参数时可分组,参数可以附加到选项字母或下一个参数(很多很多Unix命令;大多数POSIX命令).
  • 单字母选项前面有单个破折号,不允许分组,必须附加参数(RCS).
  • 单字母选项前面有单个破折号,不允许分组,参数必须是分开的(POSIX前SCCS,IIRC).
  • 多字母选项前面有单个破折号,参数可以附加或在下一个参数中(X11程序; Java和Mac OS X上的许多程序都带有NeXTSTEP遗产).
  • 以单个破折号开头的多字母选项可以缩写(Atria Clearcase).
  • 多字母选项前面加单加(过时).
  • 多字母选项前面有双短划线; 参数可以跟随'='或分开(GNU实用程序).
  • 没有前缀/后缀的选项,某些名称有缩写或暗示,参数必须是分开的.(AmigaOS Shell)

对于采用可选参数的选项,有时参数必须附加(co -p1.3 rcsfile.c),有时它必须遵循'='符号.POSIX不支持有意义的可选参数(POSIX getopt()只允许它们用于命令行的最后一个选项).

所有敏感期权系统都使用一个由双破折号(' --')组成的选项来表示"期权结束" - 以下参数是"非选项参数"(通常是文件名; POSIX称之为'操作数')即使它们也是如此从破折号开始.(我认为支持这种符号是必要的.请注意,如果--前面有一个需要参数的选项,--则将被视为选项的参数,而不是"选项结束"标记.)

许多但不是所有程序都接受单个破折号作为文件名来表示标准输入(通常)或标准输出(偶尔).有时,与GNU' tar'一样,两者都可以在一个命令行中使用:

... | tar -cf - -F - | ...
Run Code Online (Sandbox Code Playgroud)

第一个独奏短跑意味着'写入stdout'; 第二个意思是"从stdin读取文件名".

有些程序使用其他约定 - 也就是说,选项前面没有破折号.其中许多都来自Unix最古老的日子.例如,'tar'和'ar'都接受没有破折号的选项,因此:

tar cvzf /tmp/somefile.tgz some/directory
Run Code Online (Sandbox Code Playgroud)

该dd命令仅使用opt=value:

dd if=/some/file of=/another/file bs=16k count=200
Run Code Online (Sandbox Code Playgroud)

有些程序允许您完全交错选项和其他参数; 例如,C编译器,make和在环境中没有POSIXLY_CORRECT运行的GNU实用程序.许多程序希望选项先于其他参数.

请注意,git其他VCS命令通常使用混合系统:

git commit -m 'This is why it was committed'
Run Code Online (Sandbox Code Playgroud)

有一个子命令作为参数之一.通常,可以在命令和子命令之间指定可选的"全局"选项.在POSIX中有这样的例子; 该sccs命令属于此类别; 你可以争辩说,一些执行其他命令其他命令也此类别中:nice与xargs春天从POSIX介意; sudo是一个非POSIX示例,原样svn和cvs.


我不同系统之间没有强烈的偏好.当选项足够少时,带有助记符值的单个字母很方便.GNU支持这一点,但建议使用双字母表后面的多字母选项进行备份.

有些事我反对.其中一个最差的是使用不同含义的相同选项字母,具体取决于其前面的其他选项字母.在我的书中,这是禁忌,但我知道软件在哪里完成.

另一个令人反感的行为是处理参数的风格不一致(特别是对于单个程序,但也在一套程序中).要么附加参数要么需要分离参数(或允许其中任何一个),但是没有一些选项需要附加参数,而其他参数需要分离参数.并且是否=可以用来分离选项和论证.

与许多(与软件相关的)事物一样 - 一致性比个人决策更重要.使用自动化和标准化参数处理的工具有助于保持一致性.


无论你做什么,请阅读TAOUP的命令行选项并考虑命令行界面的标准.(由JF Sebastian补充 - 谢谢;我同意.)

  • `man --help`将长选项`--help`传递给`man`.`man -help`将四个选项,`-h`,`-e`,`-l`,`-p`传递给`man`.可能`man`看第一个选项`-h`,并打印出帮助和退出.但是,由每个命令来解释命令行参数. (10认同)

Car*_*rum 5

这是完全随意的; 该命令可以以其自己的特殊方式实现所有选项处理,或者它可以调用其他一些便利函数.该getopt()系列函数是相当受欢迎的,所以最近甚至远程书面大多数软件遵循这些程序设置的惯例.当然,总有例外!