我目前很困惑为什么终端中的shell globbing使用否定但在bash中运行时显示错误。
执行下面终端中执行的命令,其中显示./HTML
目录中的所有js文件,但以.bundle.js
结尾的js文件除外。
$ shopt -s globstar
$ ls ./HTML/**/!(*.bundle).js
上面的命令工作得很好,现在让我们把它放在一个bash文件中
list-js.sh
#!/usr/bin/env bash
shopt -s globstar
ls ./HTML/**/!(*.bundle).js
在终端中执行:
$ bash list-js.sh
list-js.sh: line 4: syntax error near unexpected token `('
list-js.sh: line 4: `ls ./HTML/**/!(*.bundle).js'
如您所见,它显示语法错误。
答案 0 :(得分:6)
globstar
仅启用**
模式。 extglob
选项允许!(...)
。您的交互式shell中的某个位置已经启用(可能在您的.bashrc
中,也许您之前键入了shopt -s extglob
)。但是,它需要在脚本中显式启用,因为这些设置不会从启动脚本的shell继承。
#!/usr/bin/env bash
shopt -s globstar extglob
ls ./HTML/**/!(*.bundle).js
(另外,**
没有globstar
不会导致语法错误,因为它只被视为两个相邻的*
,第二个是冗余的。)