Shell globbing否定在bash中不起作用

rye*_*lar 1 bash shell

我目前很困惑为什么终端中的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)

如您所见,它显示语法错误.

che*_*ner 6

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,第二个是冗余的.)

  • 这里不太相关,但是从`bash` 4.1开始,有一个编译时选项可以默认启用`extglob`,它总是在`[[...]]`里面暂时启用,用于`= =`和`!=`. (2认同)