命令中 - (一个连字符)和 -- (两个连字符)有什么区别?

命令中 - (一个连字符)和 -- (两个连字符)有什么区别?

两者看上去都是旗帜,但是有什么区别呢?

答案1

一般来说:

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

  • --表示命令选项的结束,其后的所有内容均为参数

为什么需要:

关于-

$ echo foobar | cat -
foobar

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

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

$ echo foobar >-spam  

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

$ cat -- -spam      
foobar

如果没有--cat则将spam全部作为其选项,因为它们后面跟着---明确指示选项的结束,之后-spam将作为文件名。

答案2

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

看一下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 ~

它们是一样的,但有些人喜欢短的版本,有些人喜欢长的版本。

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


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


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

答案3

这实际上取决于相关项目。有标准,但实际上并非如此强制执行任何地方:这取决于每个程序的实现。

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

find . -iname "*.jpg" -delete

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

cp --verbose --recursive /dir/from /dir/to
cp -v -r /dir/from /dir/to
cp -vr /dir/from /dir/to

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

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

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

答案4

一个连字符就可以选项命令的后缀传统上是 Unix 命令的后缀。它们有一个连字符,后跟一个字母(有时是数字)(-a -i -T)。一些选项后跟一个参数(-ofilename -o filename)。

对于 GNU 系统(即 Linux 系统)上的程序/命令,最常用的是两个连字符,也是提供选项的首选方式。它们有两个连字符,后跟一个或多个单词,单词之间用单个连字符 ( --version --ignore-case) 分隔。带参数的选项使用等号分隔选项和参数 ( --log-file=filename)

旧式单连字符选项的缺点是,没有标准字母可以在不同的命令上执行相同的操作。是的,-v通常用于“详细” --V有时用于“版本” - 但命令之间没有真正的共识。例如,-i表示“交互式” cp、、mvln-rm命令将在覆盖或删除之前提示。但它在中表示“忽略大小写” grep。为了使其更加困难,该命令sort使用-f- 表示“折叠大小写” - 以相同的方式忽略大小写。为了使混乱更加严重,许多命令 - 包括mvcp- 都用于-f“强制”... 命令必须执行某些操作(例如覆盖现有文件),即使通常不会这样做。

除此之外,不同 Unix 系统(Solaris、*BSD、SysV、AIX 等)的命令可能使用不同的字母来执行相同的操作。例如,该who命令列出了系统上的用户。该命令可以选择性地显示哪些用户接受来自其他用户的消息到他们的终端 - Linux 下有此选项-w,而 Solaris 使用-T

另一方面,长选项允许在所有命令上使用相同的选项,并且它们实际上描述了选项的作用。例如--ignore-case,,,,。因此在和中--interactive都使用。--version--force--ignore-casegrepsort

但同样,它们几乎仅用于作为 GNU 项目的一部分而制作的命令/程序……

最后,双连字符用于告诉命令选项列表已经结束,后面跟着的是参数——无论它们有多少像选项。如果文件名以连字符开头(例如-this_is_a_bad_filename),命令可能会将其与选项混淆并尝试解析它 - 双连字符可以防止这种情况。 mv -vi -- -this_is_a_bad_filename this_is_a_better_filename(如果文件名以连字符开头,则只应使用命令... ;-)

相关内容