Как я могу разобрать строку в соответствующие аргументы для 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'
}