“--”(双破折号)是什么意思?

dog*_*ane 659 command-line shell utilities syntax

--compgen命令中看到使用过。

例如:

compgen -W "foo bar baz" -- b
Run Code Online (Sandbox Code Playgroud)

里面的意思是什么--

Gus*_*uss 807

更准确地说,--在大多数 Bash 内置命令和许多其他命令中使用双破折号 ( ) 来表示命令选项的结束,之后只接受位置参数。

使用示例:假设您要为字符串 grep 文件-v- 通常-v将被视为反转匹配含义的选项(仅显示不匹配的行),但--您可以-v像这样对字符串进行 grep :

grep -- -v file
Run Code Online (Sandbox Code Playgroud)

  • `--` 用于将选项与 `grep` 中的正则表达式分开,但规范的方法是使用 `-e`/`--regexp`。 (14认同)
  • @l0b0:要搜索的模式通常是位置参数之一,因此它可以放在 `--` 之后,尽管您正确地注意到我上面的示例也可以写为 `grep -e -v file`(虽然这很令人困惑)。 (9认同)
  • 最显着的是在内置的 Bash `set` 中,这是绝对必要的。 (5认同)
  • 并非所有 `bash` 内置命令都接受 `--` 作为选项标记的结束。`[` 和 `echo` 不是例如([不能可靠地使用 `echo` 的原因之一](http://unix.stackexchange.com/q/65803))。 (4认同)

ken*_*orb 63

man bash我们可以阅读shell内建命令部分:

除非另有说明,本节中记录的每个内置命令都接受以-accepts-- 开头的选项,以表示选项的结束

:truefalse,和test建宏不接受选项,并没有把--特别。的exitlogoutbreakcontinuelet,和shift内建接受并处理论点开始-,而不需要--。其他接受参数但未指定为接受选项的内置函数将参数以-无效选项开头并要求--阻止这种解释。

请注意,这echo并不--意味着选项结束。


pol*_*mon 53

这标志着参数(选项)列表的结束。


Joh*_*Doe 28

POSIX.1-2017

12.2 实用程序语法指南

准则 10:

第一个--不是选项参数的参数应该被接受为指示选项结束的分隔符。任何后续参数都应视为操作数,即使它们以 ' -' 字符开头。

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html#tag_12_02

  • 这是权威答案。 (3认同)

Sté*_*las 8

在使用POSIXgetopt() API 解析选项的命令以及其他几个命令中,--标记选项的结束。

在:

rm -f -- -f
Run Code Online (Sandbox Code Playgroud)

第一个-f被视为 的选项rm,而第二个被视为要删除的文件名,因为过去的所有--内容都不是选项。

在符合 POSIX 的实用程序和getopt()实现中,在非选项参数之后不接受选项,例如:

grep pattern -f
Run Code Online (Sandbox Code Playgroud)

需要pattern在名为-f.

但是,除非环境中有变量,否则大多数 GNU 实用程序(包括 GNU)(但不是,也不是它的任何内置程序,即使是 GNU shell)所使用的 GNU 实现getopt()及其getopt_long()扩展在默认情况下不会这样做。grepbashbashPOSIXLY_CORRECT

因此,对于那些,--即使有领先的非选项参数也是需要的:

grep -- pattern -f
Run Code Online (Sandbox Code Playgroud)

标记选项结束的旧方法是使用-. 您会发现大多数sh实现仍然支持-作为选项结束标记,以及 ksh 或 zsh 的大多数内置函数。然而,这在当今并不常见。

已知某些命令不支持--作为选项标记的结束。大多数echo实现都在其中。这是它们不能用于输出任意数据的原因之一

重要的

也就是说--,当非选项参数与启动需要-(或可能+对某些命令),但也当你不能保证一些非选项参数将不启动-/+。包括了:

  • rm -f -- "$file"
  • rm -f -- "${files[@]}"
  • rm -f -- *.txt
  • rm -f -- $(command-that-generates-a-list-of-files-or-file-patterns)
  • cmd | xargs rm -f --

如果您不能保证命令支持--作为选项标记的结束,对于那些作为文件名的参数,另一种方法是在文件名前加上前缀./

somegrep pattern ./*.txt
Run Code Online (Sandbox Code Playgroud)