终端和shell脚本之间的Bash glob模式行为不同

时间:2016-12-22 14:38:46

标签: bash macos shell terminal glob

我有一个glob模式{,**/}*.*,用于递归当前目录中的所有文件以及子目录。在终端中,如果我运行echo {,**/}*.*,它将输出当前目录中的所有文件以及嵌套目录。当我运行包含此行的shell脚本时,它只会执行一个深度目录。

我理解terminal has different behaviour than the shell:添加shopt -s extglob没有任何区别。

#!/bin/bash

shopt -s extglob
echo {,**/}*.*

我在MacOSX上启用了Bash 4 terminalshopt -s globstar

2 个答案:

答案 0 :(得分:1)

感谢@Aserre和@anubhava,它确实是bash路径的组合,并确保启用了globstar(对于MacOSX)。完整的脚本是:

#!/usr/local/bin/bash

shopt -s globstar

echo {,**/}*.*

是的./**就足够了,但这不是我的问题:)

答案 1 :(得分:0)

{,**/}*.*不会为您提供当前目录中的所有文件以及子目录。相反,它会为您提供格式的结果

directory/file.ext

您可能已使用./**代替

如果你是globstar,**将扩展到文件夹中的所有内容。即做

shopt -s globstar
echo ./** # this would suffice

除此之外,借用[ this ]注释,您需要使用支持globstar的shell版本。您可以从getting

中看出这一点
shopt: globstar: invalid shell option name

然后,

#!/bin/bash -> #!/usr/local/bin/bash

应该做的工作