Shell全局否定不';我不能在bash中工作
我目前不明白为什么终端中的shell globbing可以使用否定,但在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/**/!(
/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
,并且它总是在[…]
内部临时启用,以便与=
和一起使用=代码>。