2

如果您在 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\\}

我该如何解决这个问题?

4

2 回答 2

4

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

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

这是快速、健壮和便携的。

等效地,您可以使用为您扩展它们的第三方库

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}'")

这是缓慢、脆弱且不可移植的,因为它需要两次调用两个 Unix shell 和两个相应级别的转义。

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

于 2019-05-17T16:19:23.007 回答
0

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

相反,您可以使用以下命令发送原始命令exec()

shell.exec("bash -c 'mkdir -p ./dist/{articles,scripts,stylesheets}'")
于 2019-05-17T11:03:00.707 回答