如何使用大括号通过 "shelljs" 在单个命令中创建多个目录?

How do I use curly braces to create multiple directories in a single command via "shelljs"?

如果您在 Linux 终端中 运行 此命令:

mkdir -p ./dist/{articles,scripts,stylesheets}

它将创建以下文件夹树(在当前目录中):

dist
|- articles
|- scripts
|- stylesheets

当我尝试使用 shelljs npm 包执行相同操作时出现问题。

例如调用以下函数:

shell.mkdir("-p", "./dist/{articles,scripts,stylesheets}");

创建以下文件树的结果:

dist
|- {articles,scripts,stylesheets}

换句话说,它是一个名为 dist 的文件夹,其中包含一个名为 {articles,scripts,stylesheets}.

的子文件夹

我试过像这样转义大括号:

shell.mkdir("-p", "./dist/\{articles,scripts,stylesheets\}");

它没有用,所以我加倍努力并转义了反斜杠:

shell.mkdir("-p", "./dist/\{articles,scripts,stylesheets\}");

那也不管用,所以我再次加倍努力,在转义反斜杠之前添加了一个转义反斜杠:

shell.mkdir("-p", "./dist/\\{articles,scripts,stylesheets\\}");

这没有用,但它确实创建了一个不同名称的文件夹:

\{articles,scripts,stylesheets\}

我该如何解决这个问题?

shelljs mkdir() 命令将目录名称列表或数组作为参数。它不会尝试执行 bash 提供的任何命令或序列生成器实用程序,正如我们在 source 代码中看到的那样。所以没有必要试图逃避大括号。

相反,您可以使用 exec():

发送原始命令
shell.exec("bash -c 'mkdir -p ./dist/{articles,scripts,stylesheets}'")

正确的方法是使用循环或类似方法重写大括号展开:

const shell = require('shelljs')
for(var dir of ["articles", "scripts", "stylesheets"]) {
  shelljs.mkdir("-p", "./dist/" + dir)
}

这是快速、强大且便携的。

同样,您可以使用 third party library 为您扩展它们:

const shell = require('shelljs')
const braces = require('braces')
shell.mkdir("-p", braces("./dist/{articles,scripts,stylesheets}", {expand: true}))

字面上的方法是显式调用 Bash,因为大括号扩展是 bash 的一个特性:

shelljs.exec("bash -c 'mkdir -p ./dist/{articles,scripts,stylesheets}'")

这是缓慢、脆弱和 non-portable 因为它需要两次调用两个 Unix shell 和两个相应级别的转义。

shelljs的重点是用纯JS实现替换这样的代码,这样它就需要零调用零shell,所以这完全违背了最初使用它的目的。