我的非交互式 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。