为什么模式“* .so?(。*)”在脚本中产生语法错误但在命令行上没有?

时间:2015-06-09 14:31:00

标签: bash shell syntax

这种模式有点不寻常,因为我添加了尾部的“?(。*)”部分。它按照我的预期在命令行上运行,但我在脚本中得到了相同的语法错误。

$ bash --version
GNU bash, version 4.3.11(1)-release (i686-pc-linux-gnu)
...
$ cat x.sh
touch a.so a.so.1
ls *.so?(.*)
rm *.so?(.*)
$ touch a.so a.so.1
$ ls *.so?(.*)
a.so  a.so.1
$ rm *.so?(.*)
$ ls
x.sh
$ bash x.sh
x.sh: line 2: syntax error near unexpected token `('
x.sh: line 2: `ls *.so?(.*)'
$

1 个答案:

答案 0 :(得分:7)

您正在使用扩展的glob,但默认情况下,这些并未在脚本中启用。为了使用它们,必须明确启用它们。你可以在行之前添加:

shopt -s extglob

要稍后在脚本中停用它们,您可以使用shopt -u extglob

正如chepner正确指出的那样,此功能在交互式shell中默认也未启用。据推测,这一行存在于您的一个系统范围的启动脚本或您的一个个人启动脚本中。