如何使用大括号通过 "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,所以这完全违背了最初使用它的目的。
如果您在 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,所以这完全违背了最初使用它的目的。