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

Pet*_*r.O 10 bash shopt

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

以下extglob-dependant命令无效:syntax error near unexpected token '('.

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

这有效:

shopt -s extglob
if true ;then
    touch a.bcd; ls a.@(bcd)
fi
Run Code Online (Sandbox Code Playgroud)

这失败了:

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)' 
Run Code Online (Sandbox Code Playgroud)

lk-*_*lk- 16

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

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

  • @Peter.OI 会说是这样,因为 bash 的解析器很不稳定。当然,我是一个爱说脏话的 zsh 用户,不过我似乎记得这是 bash 邮件列表上给出的官方原因。Bash 有很多类似的解析问题,比如 `alias e=echo; e hello` 不起作用:别名定义仅发生在下一个换行符上。 (2认同)