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)
ken*_*orb 63
在man bash我们可以阅读shell内建命令部分:
除非另有说明,本节中记录的每个内置命令都接受以
-accepts--开头的选项,以表示选项的结束。在
:,true,false,和test建宏不接受选项,并没有把--特别。的exit,logout,break,continue,let,和shift内建接受并处理论点开始-,而不需要--。其他接受参数但未指定为接受选项的内置函数将参数以-无效选项开头并要求--阻止这种解释。请注意,这
echo并不--意味着选项结束。
Joh*_*Doe 28
POSIX.1-2017
12.2 实用程序语法指南
准则 10:
第一个
--不是选项参数的参数应该被接受为指示选项结束的分隔符。任何后续参数都应视为操作数,即使它们以 '-' 字符开头。
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html#tag_12_02
在使用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 -- *.txtrm -f -- $(command-that-generates-a-list-of-files-or-file-patterns)cmd | xargs rm -f --如果您不能保证命令支持--作为选项标记的结束,对于那些作为文件名的参数,另一种方法是在文件名前加上前缀./:
somegrep pattern ./*.txt
Run Code Online (Sandbox Code Playgroud)