Как использовать фигурные скобки для создания нескольких каталогов в одной команде через "shelljs"? - PullRequest
2 голосов
/ 17 мая 2019

Если вы запустите эту команду в терминале 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\\}

Как я могу решить эту проблему?

Ответы [ 2 ]

4 голосов
/ 17 мая 2019

Правильный способ - переписать расширение скобки, используя циклы или аналогичные:

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 и два соответствующих уровня экранирования.

Смысл shelljs состоит в том, чтобы заменить такой код чистыми реализациями JS, чтобы он требовал нулевых вызовов нулевых оболочек, так что это полностью отрицает цель его использования в первую очередь.

0 голосов
/ 17 мая 2019
Команда

shelljs mkdir() принимает в качестве параметра список или массив имен каталогов.Он не будет пытаться выполнить какую-либо команду или утилиту построения последовательностей, предоставляемую bash , как мы видим в исходном коде.Поэтому нет смысла пытаться убежать от скобок.

Вместо этого вы можете отправить необработанную команду с помощью exec():

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