Как я могу разобрать строку на соответствующие аргументы для дочернего процесса.Спаун?

Я хочу иметь возможность принимать командную строку, например:

some/script --option="Quoted Option" -d --another-option 'Quoted Argument'

и разобрать его на что-то, что я могу послать к child_process.spawn:

spawn("some/script", ["--option="Quoted Option"", "-d", "--another-option", "Quoted Argument"])

все библиотеки синтаксического анализа, которые я нашел (например, minimist и т. д.) do слишком много здесь, разбирая его на какой-то объект опций и т. д. Я в основном хочу эквивалент любого узла, который делает для создания process.argv в первую очередь.

это похоже на разочаровывающую дыру в собственных API с exec принимает строку, но не выполняется так безопасно, как spawn. Прямо сейчас я взламываю это, используя:

spawn("/bin/sh", ["-c", commandString])

однако я не хочу, чтобы это было связано с UNIX так сильно (в идеале это тоже работало бы на Windows). Халп?

2 ответов


стандартный метод (без библиотеки)

вам не нужно разбирать командную строку на аргументы, есть опция на child_process.spawn имени shell.

параметры.Шелл!--11-->

если true, запускает команду внутри оболочки.
Использует /bin/sh на UNIX, и cmd.exe на Windows.

пример:

let command = `some_script --option="Quoted Option" -d --another-option 'Quoted Argument'`

let process = child_process.spawn(command, [], { shell: true })  // use `shell` option

process.stdout.on('data', (data) => {
  console.log(data)
})

process.stderr.on('data', (data) => {
  console.log(data)
})

process.on('close', (code) => {
  console.log(code)
})

на minimist-string пакет может быть только то, что вы ищете.

вот пример кода, который анализирует ваш пример строки -

const ms = require('minimist-string')
const sampleString = 'some/script --option="Quoted Option" -d --another-option \'Quoted Argument\'';
const args = ms(sampleString);
console.dir(args)

этот кусок кода выводит это -

{
  _: [ 'some/script' ],
  option: 'Quoted Option',
  d: true,
  'another-option': 'Quoted Argument'
}