Shell globbing否定在bash中不起作用

时间:2016-05-30 12:49:14

标签: bash shell

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

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

1 个答案:

答案 0 :(得分:6)

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

#!/usr/bin/env bash

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

(另外,**没有globstar不会导致语法错误,因为它只被视为两个相邻的*,第二个是冗余的。)