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

Javascript 如何使用大括号通过“shelljs”在单个命令中创建多个目录?,javascript,node.js,bash,ubuntu-18.04,shelljs,Javascript,Node.js,Bash,Ubuntu 18.04,Shelljs,如果在Linux终端上运行此命令: mkdir -p ./dist/{articles,scripts,stylesheets} 它将在当前目录中创建以下文件夹树: dist |- articles |- scripts |- stylesheets 当我尝试使用npm包执行同样的操作时,就会出现问题 例如,调用以下函数: shell.mkdir("-p", "./dist/{articles,scripts,stylesheets}"); 结果将创建以下文件树: dist |- {art

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

mkdir -p ./dist/{articles,scripts,stylesheets}
它将在当前目录中创建以下文件夹树:

dist
|- articles
|- scripts
|- stylesheets
当我尝试使用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\\\\}");
这也不起作用,所以我再次向下折叠,在转义反斜杠之前添加了一个转义反斜杠:

shell.mkdir("-p", "./dist/\\{articles,scripts,stylesheets\\}");
shell.mkdir("-p", "./dist/\\\\{articles,scripts,stylesheets\\\\}");
这不起作用,但它确实创建了一个具有不同名称的文件夹:

\\{articles,scripts,stylesheets\\}
如何解决此问题?

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

相反,您可以使用以下命令发送原始命令:


正确的方法是使用循环或类似方法重写支架展开:

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的零调用,因此这完全违背了使用它的初衷。

您可以使用JavaScript循环。感谢您花时间回答,但这个解决方案不起作用,它仍然在创建一个名为{articles,scripts,stylesheets}。您会看到不同的结果,因为它依赖于未定义的行为。shelljs调用sh,因此此代码段将在macOS和CentOS上工作,其中sh是bash,而在Debian/Ubuntu和Alpine上则会失败,其中sh分别是dash和BusyBox ash。