hee*_*ayl 32

一般来说:

  • - 表示从 STDIN(文件描述符 0)读取参数/内容

  • -- 表示命令选项结束,后面的所有内容都是参数

为什么需要:

关于-

$ echo foobar | cat -
foobar
Run Code Online (Sandbox Code Playgroud)

尽管cat可以在不需要 的情况下从 STDIN 读取内容,但-许多命令都需要它,并且它们的man页面明确提到了这一点。

现在关于 --,我已经创建了一个文件-spam,让我们来看看cat这个文件:

$ echo foobar >-spam  

$ cat -spam         
cat: invalid option -- 'p'
Try 'cat --help' for more information.

$ cat -- -spam      
foobar
Run Code Online (Sandbox Code Playgroud)

没有--,cat需要s, p, a,m所有作为它们跟随的选项-,--明确指示选项的结束, 之后-spam作为文件名.

  • 哦,这也是真的:DI 假设他的意思是选项前面的 `--` 和 `-`:D (5认同)

Rin*_*ind 28

  • -- 是长名字版本
  • - 是简称版本

看一下 man ls和一些选项:

-a, --all : do not ignore entries starting with .
-A, --almost-all : do not list implied . and ..
-b, --escape : print C-style escapes for nongraphic characters
-B, --ignore-backups : do not list implied entries ending with ~
Run Code Online (Sandbox Code Playgroud)

它们是相同的,但有些更喜欢短版,有些更喜欢长版。

两者都是为了兼容性。删除选项会破坏软件。


并非每个命令都遵循这一点。正如@ Bakuriu 在评论中提到的:一个命令find具有您可以考虑的带有 1 个连字符的“长名称”。


关于编码,还有一些需要注意的地方:

  • 巴什的 getopts不支持长名称。
  • 来自 GNU utils的getopt确实如此。

  • 您还应该注意,短选项可以(通常/经常)合并,因此“-abc”不等于“--abc”,而通常等于“-a -b -c”。对于使用单破折号多字母选项(例如 openssl)的程序来说,这当然不是真的 (3认同)
  • 我相信您还应该提到并非所有程序都遵循此约定。例如,`find` 仅使用单连字符版本,即使用于指定长选项,其他程序也是如此。 (2认同)

TRi*_*RiG 7

这实际上取决于有关的程序。有标准,但实际上并没有强制执行任何地方:这取决于每个程序来实施它们。

find例如,该命令采用带单个连字符的全名参数:

find . -iname "*.jpg" -delete
Run Code Online (Sandbox Code Playgroud)

但是,一般情况下,双连字符表示开关是一个完整的单词,单连字符表示开关是单个字母。并且可以组合单字母开关,这意味着以下所有命令都是等效的:

cp --verbose --recursive /dir/from /dir/to
cp -v -r /dir/from /dir/to
cp -vr /dir/from /dir/to
Run Code Online (Sandbox Code Playgroud)

双连字符后跟一个空格也可用于表示“这是命令的结尾;后面的所有内容都是文件名,即使它看起来像命令”。

并且没有以下字母的单个连字符可以表示“从标准输入读取,而不是从文件读取”。

然而,所有这些都是依赖于程序的。任何给定的程序都可能违反这些标准中的任何一个,例如,使用find.