Как я могу разобрать строку на соответствующие аргументы для дочернего процесса.Спаун?
Я хочу иметь возможность принимать командную строку, например:
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'
}