我正在查看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
分配一个值,但--
在此作业中究竟做了什么?另外,为什么是双分叉?
答案 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
双半冒号结束案例分支。