如何在早于 v4 的 bash 上使用 globstar

dia*_*lex 0 bash javascript globbing redhat-enterprise-linux

我们使用此命令使用mocha运行所有测试:mocha ./src/test/**/*.js --recursive

注意双**. 它在任何现代 bash 上都可以正常工作,但 CI 系统是 RedHat 和GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu).

我读到v3 不支持双 globstar

  • 我试图通过执行来启用它shopt -s globstar
    • 但没能说shopt: globstar: invalid shell option name
  • 我要求客户的 devops 更新 bash
    • 但他说“它没有告诉我有新版本的 bash 可用”。
  • 这个其他答案没有帮助。

问题:如何**在 linux bash v3.* 上执行命令?任何解决方法?

use*_*686 5

如果它不支持globstar,那么它就不支持它。

然而,大部分的时间,你可以适应findxargs和/或类似的工具。您的案例非常简单,所有内容都在一个目录下,因此:

find src/test -name "*.js" -exec mocha --recursive {} +

find src/test -name "*.js" -print | xargs -d '\n' mocha --recursive
Run Code Online (Sandbox Code Playgroud)

find将文件名代替{},而xargs将它们附加到末尾。因​​此,在这两种情况下,重复的参数必须放在所有 --options 之后,但这对于大多数程序来说应该不是问题。)

或者,如果mocha 对每个文件运行一次就可以了,那么:

find src/test -name "*.js" -exec mocha {} --recursive \;
Run Code Online (Sandbox Code Playgroud)

比较-exec … \;(一次一个文件)和较早的-exec … +(尽可能多的)。

注意:在上述所有示例中,"*.js"必须引用the ,因为您要find处理它,而不是 shell。