【问题标题】:How do I use curly braces to create multiple directories in a single command via "shelljs"?如何使用花括号通过“shelljs”在单个命令中创建多个目录?
【发布时间】:2019-10-04 16:16:26
【问题描述】:

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

我该如何解决这个问题?

【问题讨论】:

  • 你可以用 JavaScript 循环代替。

标签: javascript node.js bash ubuntu-18.04 shelljs


【解决方案1】:

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

您可以使用exec() 发送原始命令:

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

【讨论】:

  • 感谢您抽出宝贵时间回答,但此解决方案不起作用,它仍在创建一个名为 {articles,scripts,stylesheets} 的子文件夹。
  • 您会看到不同的结果,因为它依赖于未定义的行为。 shelljs 调用 sh,所以这个 sn-p 将在 macOS 和 CentOS 上工作,其中 shbash,而它在 Debian/Ubuntu 和 Alpine 上失败,其中 shdash 和 BusyBox ash分别。
【解决方案2】:

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

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,所以这完全违背了最初使用它的目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-01
    • 2017-09-23
    • 1970-01-01
    • 2011-08-12
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多