2

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

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

什么时候遇到过这种情况?我认为上面的第二行类似于

--import|-i)

这对我来说很有意义。我搜索了我的bash_completion.d目录,'+\\('但那是唯一出现的一个,所以我想这并不常见。

4

1 回答 1

3

这段代码在没有上下文的情况下确实令人费解。事实上,它匹配两个文字字符串 -

$ case "+(--import" in +\(--import|-i\)) echo match ;; esac
match
$ case "-i)" in +\(--import|-i\)) echo match ;; esac
match

它看起来类似于扩展的 glob 模式+(--import|-i),但在这种形式下,它既不匹配文字模式(需要转义管道),也不是实际模式(需要转义括号)。我猜是“错误”,但是 bash 补全是疯狂元编程的雷区,所以如果没有看到整个脚本就不可能说出来。

来自bash(1)

如果使用内置 shopt 启用了 extglob shell 选项,则可以识别多个扩展模式匹配运算符。在下面的描述中,模式列表是一个或多个由 | 分隔的模式的列表。可以使用以下子图案中的一种或多种来形成复合图案:

[...]

          +(pattern-list)
                 Matches one or more occurrences of the given patterns
于 2012-09-19T05:58:06.357 回答