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


8

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

Answers:


14

不知道在这个问题上是否有更权威的资料(例如手册页/官方文档),但是我找到了一个解释此行为的网站:http : //mywiki.wooledge.org/glob

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


1
谢谢。该wooledge链接覆盖它相当不错。我认为由于某些遗留问题,必须采用这种方式。
Peter.O 2012年

@ Peter.OI之所以这么说是因为bash的解析器很奇怪。当然,我是一个肮脏的zsh用户,除了我似乎记得这是bash邮件列表中给出的官方原因。Bash有很多类似的解析问题,例如alias e=echo; e hello无法正常工作:别名定义仅在下一个换行符上发生。
吉尔(Gilles)'所以

很有意思,谢谢...有一天,我会四处看看zsh。似乎到处都是风吹草动。非常紧凑的
Peter.O 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.