我无法理解以下代码在 bash 完成脚本中的作用:
case "$last" in
+\(--import|-i\))
_filedir '+(txt|html)';;
什么时候遇到过这种情况?我认为上面的第二行类似于
--import|-i)
这对我来说很有意义。我搜索了我的bash_completion.d
目录,'+\\('
但那是唯一出现的一个,所以我想这并不常见。
我无法理解以下代码在 bash 完成脚本中的作用:
case "$last" in
+\(--import|-i\))
_filedir '+(txt|html)';;
什么时候遇到过这种情况?我认为上面的第二行类似于
--import|-i)
这对我来说很有意义。我搜索了我的bash_completion.d
目录,'+\\('
但那是唯一出现的一个,所以我想这并不常见。
这段代码在没有上下文的情况下确实令人费解。事实上,它匹配两个文字字符串 -
$ 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