设置 shopt extglob 的范围限制是什么?和其他选择?

设置 shopt extglob 的范围限制是什么?和其他选择?

我的非交互式 bash shell 有extglob off.我想在命令之前的语句中将其打开,但我注意到当shopt -s extglob位于if .. then .. else块内时,它以某种方式不会注册。

下列依赖于 extglob命令无效:syntax error near unexpected token '('

可以在哪里extglob设置,为什么会有限制?这适用于其他选项吗? ...GNU bash 4.1.5

这有效:

shopt -s extglob
if true ;then
    touch a.bcd; ls a.@(bcd)
fi

这失败了:

if true ;then
    shopt -s extglob
    touch a.bcd; ls a.@(bcd)
fi
... line 17: syntax error near unexpected token `('
... line 17: `touch a.bcd; ls a.@(bcd)' 

答案1

不确定是否有关于此问题的更权威的来源(即手册页/官方文档),但我找到了一个解释此行为的网站:http://mywiki.wooledge.org/glob

由于 extglob 选项改变了某些字符的解析方式,因此在 shopt 命令和使用扩展 glob 的任何后续命令之间有必要有一个换行符(而不仅仅是分号)。同样,您不能将 shopt -s extglob 放入使用扩展 glob 的语句块中,因为在定义该块时必须对整个块进行解析; shopt 命令在块被评估之前不会生效,此时为时已晚。事实上,由于 bash 在评估任何语句块之前都会解析整个语句块,因此您需要在最外层块之外设置 extglob。

相关内容