令人困惑的bash完成脚本的情况

时间:2012-09-19 05:24:57

标签: bash

我无法理解以下代码在bash完成脚本中的作用:

    case "$last" in
    +\(--import|-i\))
            _filedir '+(txt|html)';;

这种情况什么时候见过?我认为上面的第二行就像是

--import|-i)

这对我有意义。我为我bash_completion.d目录'+\\('抓了一下,但那个是唯一一个出现的目录,所以我猜这不常见。

1 个答案:

答案 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