我已经看到--命令中使用了compgen

例如:

compgen -W "foo bar baz" -- b


--的含义是什么?

#1 楼

更准确地说,大多数bash内置命令和许多其他命令中都使用双破折号(--)表示命令选项的结尾,此后仅接受位置参数。

示例用法:let说您要为字符串-v grep一个文件-通常,将-v视为反转匹配含义的选项(仅显示不匹配的行),但是使用--您可以为字符串-v进行grep这样的操作:

grep -- -v file


评论


最明显的是在绝对必要的内置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

#2 楼

man bash中,我们可以阅读“ Shell内置命令”部分:内置的---:true不接受选项,也不对false进行特殊处理。内置的test--exitlogoutbreakcontinue内置函数接受和处理以let开头的参数,而无需shift。其他接受参数但未指定为接受选项的内置函数会将以-开头的参数解释为无效选项,并要求--阻止这种解释。
请注意,-不会将--解释为选项的结尾。


#3 楼

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

#4 楼


POSIX.1-2017

12.2实用程序语法准则

第一个--参数不是一个选项-参数应
作为指示选项结束的定界符被接受。下列所有
参数都应视为操作数,即使它们以
'-'字符开头。


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

#5 楼

在使用POSIX getopt() 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