这个bash脚本摘录中的双破折号在做什么
我正在看一段bash的摘录,我试图了解这里到底发生了什么,特别是在这个bash脚本摘录中的双破折号在做什么,bash,Bash,我正在看一段bash的摘录,我试图了解这里到底发生了什么,特别是在COMPREPLY作业中: case "$cur" in -*) COMPREPLY=( $( compgen -W '-a -d -f -l -t -h --aoption --debug \ --file --log --test --help --' -- $cur ) );; # Generate the completion matche
COMPREPLY
作业中:
case "$cur" in
-*)
COMPREPLY=( $( compgen -W '-a -d -f -l -t -h --aoption --debug \
--file --log --test --help --' -- $cur ) );;
# Generate the completion matches and load them into $COMPREPLY array.
# xx) May add more cases here.
# yy)
# zz)
esac
我知道我们在这里根据
compgen
的输出为COMPREPLY
赋值,但是--
在这个赋值中到底做了什么?还有,为什么要用双分号?双破折号结束getopt_long中的参数部分。从手册上
特殊参数“-”强制结束选项扫描
扫描模式的选择
双分号结束一个case分支。的含义实际上取决于您正在执行的程序。在本例中,compgen
。检查该程序的文档,应该在那里进行解释
不一定总是遵循的一个常见约定是将
--
之后的所有内容都视为参数,而不尝试将其解析为选项或标志。作为一个具体的例子,考虑运行GNU<代码> Ls>代码>命令的情况,得到一个名为“代码> -T < /代码>的文件的详细列表。运行ls-l-t
将把-t
视为一个选项(按时间顺序输出),而不是一个文件名参数。解决方案是ls-l--t
,这样ls
就不会尝试解析--
之后的参数。这只是一个惯例,并非所有的程序都会遵循它。还请注意,我编写的GNUls
不仅仅是ls
,因为其他实现的行为可能不同。compgen
是一个bash
内置命令,手册页上说:
除非另有说明,否则本节中记录的每个内置命令都是接受选项,前面加-accept--表示选项结束
由于$cur
是一个包含选项的变量(从-
开始),因此需要-
来区分compgen
选项和要处理的输入
以下命令正在转动--debug
中的选项--d
:
compgen -W '-a -d -f -l -t -h --aoption --debug --file --log --test --help --' -- --d
--debug
如果删除分隔符--
,该命令将抛出错误,因为compgen
没有任何以--d
开头的选项:
compgen -W '-a -d -f -l -t -h --aoption --debug --file --log --test --help --' --d
-bash: compgen: --: invalid option
compgen: usage: compgen [-abcdefgjksuv] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word]
是案例
,esac
语句中使用的分隔符,用于在示例中终止以-*)开头的部分
。查看bash
手册页中的复合命令
以获取更多信息。现在真的取决于COMPGEN,不是吗?在git中,双破折号本身将程序参数和文件名分隔开。你可能应该读一下这些文件。