Pac*_*ier 76 windows linux unix command-line
我想知道为什么有些程序要求他们的命令提示参数前面有两个破折号,而有些(大多数)只需要前面一个破折号?
例如,大多数程序看起来像这样: relaxer -dtd toc.xml toc_gr.xml toc_jp.xml
而有些程序看起来像这样: xmllint --valid toc.xml --noout
有些需要两个破折号而不是一个破折号的原因是什么?每个人都坚持一个标准是否有意义(即一个破折号就可以)。
Dan*_*eck 39
没有普遍的标准。例如在 GNU 程序中有一些一致性,但您需要检查每个程序的文档。
引用Wikipedia,强调我的:
在类 Unix 系统中,ASCII 连字符减号通常用于指定选项。该字符通常后跟一个或多个字母。一个单独的连字符减号本身没有任何字母的参数通常指定程序应该处理来自标准输入的数据或将数据发送到标准输出。在某些程序中使用两个连字符减号 (--) 来指定使用更具描述性的选项名称的“长选项”。这是 GNU 软件的一个共同特点。
通常,连字符表示预定义的参数。我认为它用于将它们与您可能用作参数的文件名或其他标签区分开来。不过,情况并非总是如此(见下文)。
您经常会发现相同的参数可用作 short 和 long 选项,例如在ls 中。
一些程序对单字符选项使用单个连字符,对多字符选项使用两个连字符,但不是全部(find想到GNU )。一些程序有可选的连字符或完全跳过它们(tar或者ps想到BSD )。
有时长选项 ( --foo) 需要参数,而短选项 ( -f) 不需要(或至少暗示特定的默认参数)。
短选项(例如cut -d ' ')可以有参数,而长选项(例如ls --all)不一定有参数。
要设置程序的特定行为,您有时需要使用短选项,对于其他人您需要使用长选项,而对于某些您可以选择。
与此相关的是,一些程序可以处理option 和它的 argument 之间没有空格,而其他程序则不能。
正如我在开头写的那样,没有共同的行为或标准。通常,您可以将类似的行为追溯到用于参数解析的同一个库,但您可能不想阅读源代码来找出这一点。
你真的无法从另一个程序的参数语法推断出一个程序的参数语法。
如果您还考虑 Windows,情况会更糟:虽然 Windows 命令行调用传统上使用/f(至少大部分时间,单个字符)作为选项,:作为选项和它们的值之间的分隔符(参见例如此处);跨平台实用程序很普遍(如您提到的那些),并为参数带来了更常见的连字符语法,以及上面提到的所有不一致之处。
bar*_*lop 25
只需执行ls --help
并查看选项,然后就会更清楚。
它与参数完全无关。许多选项都有短格式和长格式,许多选项只有一个而不是另一个。
而且,关于参数,只是在长格式中,当它们采用参数时,它看起来总是带有等号。但很明显,短的也可以接受同样多的参数;只是他们不使用等号。
这是从ls --help(man ls提供等效信息)的摘录。请注意,有些有长格式而没有短格式 ( --author, --block-size),有些有短格式而没有长格式 ( -c, -f, -g),还有一些既有长格式又有短格式 ( -A/ --almost-all, -b/ --escape)。
-a, --all do not ignore entries starting with .
-A, --almost-all do not list implied . and ..
--author with -l, print the author of each file
-b, --escape print octal escapes for nongraphic characters
--block-size=SIZE use SIZE-byte blocks
-B, --ignore-backups do not list implied entries ending with ~
-c with -lt: sort by, and show, ctime (time of last
modification of file status information)
with -l: show ctime and sort by name
otherwise: sort by ctime
-C list entries by columns
--color[=WHEN] control whether color is used to distinguish file
types. WHEN may be `never', `always', or `auto'
Run Code Online (Sandbox Code Playgroud)
Roo*_*ook 10
这是来自 *nix 的约定。双连字符在选项之前是完整的,而单连字符在选项之前是短格式。例如ls --all --l,可以缩短为ls -al. 正如所见,并非所有选项都有它们的单字母等价物,尽管更常用的选项通常如此。
选项是否接受一个参数并没有真正的区别 - 它可以接受或不接受它们,无论您输入选项的方式如何。
当一次性使用它们时,这并不重要,但是当在 .alias 文件中编写命令时,习惯上使用完整形式。纯粹是为了方便下一个人阅读。