如果您在 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\\}
如何解决这个问题?
最佳答案
正确的方法是使用循环或类似的方式重写大括号扩展:
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}'")
这是缓慢、脆弱且不可移植的,因为它需要两次调用两个 Unix shell 和两个相应级别的转义。
shelljs
的目的是用纯JS实现替换这样的代码,这样它就需要零调用零个shell,所以这完全违背了使用它的初衷。
关于javascript - 如何使用大括号通过 "shelljs"在单个命令中创建多个目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56184584/