Shell全局否定不';我不能在bash中工作

Shell全局否定不';我不能在bash中工作,bash,shell,Bash,Shell,我目前不明白为什么终端中的shell globbing可以使用否定,但在bash中运行时会显示错误 以下面终端中执行的命令为例,该终端显示/HTML目录中的所有js文件,但以.bundle.js结尾的js文件除外 $ shopt -s globstar $ ls ./HTML/**/!(*.bundle).js 上面的命令工作得很好,现在让我们把它放在一个bash文件中 列出js.sh #!/usr/bin/env bash shopt -s globstar ls ./HTML/**/!(

我目前不明白为什么终端中的shell globbing可以使用否定,但在bash中运行时会显示错误

以下面终端中执行的命令为例,该终端显示
/HTML
目录中的所有js文件,但以
.bundle.js
结尾的js文件除外

$ shopt -s globstar
$ ls ./HTML/**/!(*.bundle).js
上面的命令工作得很好,现在让我们把它放在一个bash文件中

列出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'

如您所见,它显示了一个语法错误。

globstar
仅启用
**
模式。
extglob
选项允许
!(…)
。在交互式shell中的某个地方,它已经被启用(可能在
.bashrc
中,也可能在前面键入了
shopt-s extglob
)。但是,它需要在脚本中显式启用,因为这些设置不是从启动脚本的shell继承的

#!/usr/bin/env bash

shopt -s globstar extglob
ls ./HTML/**/!(*.bundle).js

(顺便说一句,没有
globstar
**
不会导致语法错误,因为它被简单地视为两个相邻的
*
s,第二个是冗余的。)

globstar
仅启用
**
模式。
extglob
选项允许
!(…)
。在交互式shell中的某个地方,它已经被启用(可能在
.bashrc
中,也可能在前面键入了
shopt-s extglob
)。但是,它需要在脚本中显式启用,因为这些设置不是从启动脚本的shell继承的

#!/usr/bin/env bash

shopt -s globstar extglob
ls ./HTML/**/!(*.bundle).js

(顺便说一句,没有
globstar
**
不会导致语法错误,因为它被简单地视为两个相邻的
*
s,第二个是多余的。)

您在您的script@AndreaCorbellini我编辑了脚本,忘记添加
shopt-s globstar
。我很确定这不是问题。然后你必须启用另一个选项。也许是extglob?@JulienLopez肯定不是:)@Ryeball后来看到了你的评论:p您在您的电脑中忘记了
shopt-s globstar
script@AndreaCorbellini我编辑了脚本,忘记添加
shopt-s globstar
。我很确定这不是问题。然后你必须启用另一个选项。也许是extglob?@JulienLopez肯定不是:)@Ryeball后来看到了你的评论:p非常感谢,我已经假设
extglob
已经启用,因为它已经在我的终端中启用,而我没有启用它。我猜我的
.bashrc
上有一个脚本,它本身就启用了它。这里不太相关,但从
bash
4.1开始,默认情况下有一个编译时选项可以启用
extglob
,并且它总是在
[…]
内部临时启用,以便与
=
一起使用=
。非常感谢,我已经假设
extglob
已经启用,因为它已经在我的终端中启用,而我没有启用它。我猜我的
.bashrc
上有一个脚本,它本身就启用了它。这里不太相关,但从
bash
4.1开始,默认情况下有一个编译时选项可以启用
extglob
,并且它总是在
[…]
内部临时启用,以便与
=
一起使用=