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

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

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 и т.д.), делают слишком много здесь, анализируя его на какой-то объект опций и т.д. Я в основном хочу эквивалент любого Node делает для создания process.argv в первую очередь.

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

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

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

Ответ 1

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

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

options.shell

Если 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)
})

Ответ 2

Пакет 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'
}