--
命令中使用了compgen
。例如:
compgen -W "foo bar baz" -- b
--
的含义是什么?#1 楼
更准确地说,大多数bash内置命令和许多其他命令中都使用双破折号(--
)表示命令选项的结尾,此后仅接受位置参数。示例用法:let说您要为字符串
-v
grep一个文件-通常,将-v
视为反转匹配含义的选项(仅显示不匹配的行),但是使用--
您可以为字符串-v
进行grep这样的操作:grep -- -v file
#2 楼
在man bash
中,我们可以阅读“ Shell内置命令”部分:内置的-
,--
,:
和true
不接受选项,也不对false
进行特殊处理。内置的test
,--
,exit
,logout
,break
和continue
内置函数接受和处理以let
开头的参数,而无需shift
。其他接受参数但未指定为接受选项的内置函数会将以-
开头的参数解释为无效选项,并要求--
阻止这种解释。请注意,
-
不会将--
解释为选项的结尾。#3 楼
这标志着参数(选项)列表的结尾。#4 楼
POSIX.1-2017
12.2实用程序语法准则
第一个
--
参数不是一个选项-参数应作为指示选项结束的定界符被接受。下列所有
参数都应视为操作数,即使它们以
'
-
'字符开头。http://pubs.opengroup.org/ onlinepubs / 9699919799 / basedefs / V1_chap12.html#tag_12_02
#5 楼
在使用POSIXgetopt()
API以及其他几个语法分析选项的命令中,--
标记了选项的结尾。在:
rm -f -- -f
第一个
-f
用作rm
的选项,而第二个--
则作为要删除的文件的名称,因为超过getopt()
的所有内容都不作为选项。和pattern
的实现,在非选项参数之后不接受选项,因此例如:grep pattern -f
需要在名为
-f
的文件中查找与getopt()
匹配的行。 br /> 但是,大多数GNU实用程序(包括GNU
getopt_long()
(但不是grep
或它的任何内置函数,即使bash
是GNU shell)也使用)所使用的bash
及其扩展名的GNU实现并不能做到这一点默认值,除非环境中存在POSIXLY_CORRECT
变量。因此,对于这些变量,即使有泄漏,也需要
--
ding non-option arguments:grep -- pattern -f
标记选项结束的一种较旧的方法是使用
-
。您会发现,大多数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
评论
最明显的是在绝对必要的内置Bash集中。
–l0b0
2012年10月18日在9:03
-可以将选项与grep中的正则表达式分开,但是规范的方法是使用-e /-regexp。
–l0b0
2012年10月18日,9:05
@ l0b0:要搜索的模式通常是位置参数之一,因此它可以放在-之后,尽管您正确地指出,我的上述示例也可以写为grep -e -v文件(尽管这很正确)令人困惑)。
–古斯
2015年1月21日,16:12
并非所有bash内置命令都接受-作为选项标记的结尾。 [和echo例如,(echo无法可靠使用的原因之一)。
–StéphaneChazelas
16-3-21在10:06