我无法理解以下代码在bash完成脚本中的作用:
case "$last" in
+\(--import|-i\))
_filedir '+(txt|html)';;
这种情况什么时候见过?我认为上面的第二行就像是
--import|-i)
这对我有意义。我为我bash_completion.d
目录'+\\('
抓了一下,但那个是唯一一个出现的目录,所以我猜这不常见。
答案 0 :(得分:3)
这段代码确实令人费解,没有上下文。实际上,它匹配两个文字字符串 -
$ case "+(--import" in +\(--import|-i\)) echo match ;; esac
match
$ case "-i)" in +\(--import|-i\)) echo match ;; esac
match
它看起来类似于扩展的glob模式+(--import|-i)
,但是在这种形式下,它既不匹配文字模式(需要转义管道)也不是实际模式(需要忽略括号)。我猜“bug”,但是bash完成是一个疯狂的元编程的雷区,所以如果没有看到整个脚本就不可能说。
来自bash(1)
如果使用内置的shopt启用了extglob shell选项, 几个扩展模式匹配运算符被识别。在里面 在下面的描述中,模式列表是一个或多个的列表 由|分隔的模式。可以使用一个形成复合图案 或更多以下子模式:
[...]
+(pattern-list) Matches one or more occurrences of the given patterns