我目前很困惑为什么终端中的shell globbing使用否定但在bash中运行时显示错误.
获取下面终端中执行的命令,该命令显示./HTML目录中的所有js文件,但以js文件结尾的文件除外.bundle.js.
$ shopt -s globstar
$ ls ./HTML/**/!(*.bundle).js
Run Code Online (Sandbox Code Playgroud)
上面的命令工作得很好,现在让我们把它放在一个bash文件中
list-js.sh
#!/usr/bin/env bash
shopt -s globstar
ls ./HTML/**/!(*.bundle).js
Run Code Online (Sandbox Code Playgroud)
在终端中执行:
$ bash list-js.sh
list-js.sh: line 4: syntax error near unexpected token `('
list-js.sh: line 4: `ls ./HTML/**/!(*.bundle).js'
Run Code Online (Sandbox Code Playgroud)
如您所见,它显示语法错误.
globstar仅启用**模式.该extglob选项允许!(...).您的交互式shell中的某个位置已经启用(可能在您的.bashrc,也许您shopt -s extglob之前输入过).但是,需要在脚本中显式启用它,因为此类设置不会从启动脚本的shell继承.
#!/usr/bin/env bash
shopt -s globstar extglob
ls ./HTML/**/!(*.bundle).js
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,**没有globstar引起语法错误,因为它被简单地视为两个相邻的*s,第二个是冗余的.)