看起来大多数命令都使用这样的选项参数:
如果一个短选项需要一个选项参数,该选项与选项参数之间用空格分隔,例如:
如果一个长选项需要一个选项参数,则该选项与选项参数之间用$ head -n 10
=
分隔,例如:
$ head --lines=10
这是一种约定吗?如果是,我在哪里可以找到它?此外,背后的逻辑是什么?
为什么它不是
$ head --lines 10
?
看起来大多数命令都使用这样的选项参数:
如果一个短选项需要一个选项参数,该选项与选项参数之间用空格分隔,例如:
$ head -n 10
如果一个长选项需要一个选项参数,则该选项与选项参数之间用 =
分隔,例如: $ head --lines=10
这是一种约定吗?如果是,我在哪里可以找到它?此外,背后的逻辑是什么?
为什么它不是
$ head --lines 10
?
短选项的基本原理在 POSIX 实用约定 中有详细记录。由于广泛的历史先例,大多数选项解析器允许将值“附加”到字母上(例如 -n10
)。
长选项的基本原理由 GNU 在其编码标准和 getopt_long()
的手册页面中指定。
有些选项需要一个可选参数,有时必须附加,有时必须跟随 '=' 符号。 POSIX 对可选参数的支持不太明显(POSIX getopt() 仅允许它们出现在命令行上的最后一个选项中)。
所有合理的选项系统都使用只包含双破折号 ('--') 的选项来表示“选项结束”,接下来的参数是“非选项参数”(通常是文件名),即使它们以破折号开头。(我认为支持这种表示法是必要的。)请注意,如果您有一个带有期望参数的选项 '-f' 的命令 'cmd',那么如果您用 '--' 替换参数调用它('cmd -f -- -other'),许多版本的 getopt() 将把 '--' 视为 '-f' 的文件名,然后将 '-other' 解析为常规选项。也就是说,如果必须将其解释为另一个选项的参数,则 '--' 不会终止选项。
许多但不是所有程序都接受单破折号作为文件名,表示标准输入(通常)或标准输出(偶尔)。有时,如 GNU 'tar',两者可以在单个命令行中使用:
tar -cf - -F - | ...
tar cvzf /tmp/somefile.tgz some/directory
dd
命令完全使用 opt=value
:
dd if=/some/file of=/another/file bs=16k count=200
git
)越来越倾向于使用基本命令名称(git
),后跟子命令(commit
),再后跟选项(-m“提交消息”
)。这种风格最初由sccs
界面到SCCS命令,然后是cvs
,svn
也使用它(它们都是版本控制系统)。但是,其他大型命令套件在适当时也会采用类似的风格。
head
和grep
。从man getopt_long
中可以看到:“长选项可能需要参数,格式为--arg=param或--arg param。”但是各个实用程序的man页面通常不会记录等号是可选的。 - Dennis Williamsonls --color
,默认为alw[ays]
。在该示例中省略等号将导致输入被视为命令的文件或目录。 - user4104817ls
示例需要等号,但考虑:echo foo | grep --regexp o
- 它可以带或不带等号工作,--max-count
也是如此。然而,grep --color
需要等号! - Dennis Williamson