Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个bash脚本摘录中的双破折号在做什么_Bash - Fatal编程技术网

这个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

我正在看一段bash的摘录,我试图了解这里到底发生了什么,特别是在
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
就不会尝试解析
--
之后的参数。这只是一个惯例,并非所有的程序都会遵循它。还请注意,我编写的GNU
ls
不仅仅是
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中,双破折号本身将程序参数和文件名分隔开。你可能应该读一下这些文件。