这个bash脚本摘录中的双短划线是做什么的

时间:2017-12-05 02:40:50

标签: 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 matches and load them into $COMPREPLY array.
#   xx) May add more cases here.
#   yy)
#   zz)
  esac

我知道我们会根据COMPREPLY的输出在此处为compgen分配一个值,但--在此作业中究竟做了什么?另外,为什么是双分叉?

3 个答案:

答案 0 :(得分:4)

var trial= { points:[{x:1,y:2},{x:5,y:2},{x:3,y:4}] , obj:{id:5,name:"MyName"} }, path1 = ["points",0,"x"], path2= ["obj","name"], valueAtPath = (object, path) => path.reduce((r,p) => r[p], object); console.log(valueAtPath(trial, path1)); console.log(valueAtPath(trial, path2));是一个compgen内置命令,手册页说:

  

除非另有说明,否则本节中记录的每个内置命令都是接受选项 - 接受 - 表示选项的结束。

由于bash是包含选项的变量(从$cur开始),因此需要-(如手册页中所述)以区分-- }选项和要处理的输入。

以下命令正在转换compgen中的选项--d

--debug

如果删除分隔符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] ;;case语句中使用的分隔符,在您的示例中以esac开头的部分终止。查看-*)的{​​{1}}手册页以获取更多信息。

答案 1 :(得分:1)

--的含义实际上取决于您正在执行的程序。在此示例中compgen。查看该程序的文档,应该在那里解释。

不一定遵循的常见约定是将--之后的所有内容视为参数,并且不要尝试解析为选项或标志。作为一个具体示例,请考虑运行GNU ls命令以获取名为-t的文件的详细列表。运行ls -l -t会将-t视为一个选项(按时间排序),而不是文件名参数。解决方案是ls -l -- -t,这样ls将不会尝试在--之后解析参数。这只是一个惯例,并非所有程序都可以遵循它。另请注意,我编写的GNU ls不仅仅是ls,因为其他实现可能会有不同的行为。

答案 2 :(得分:0)

双短划线结束getopt_long中的参数部分。从手册。

  

特殊参数“ - ”强制结束选项扫描,无论如何   扫描模式。

https://linux.die.net/man/3/getopt_long

双半冒号结束案例分支。