如何将字符串解析为 child_process.spawn 的适当参数?
Posted
技术标签:
【中文标题】如何将字符串解析为 child_process.spawn 的适当参数?【英文标题】:How can I parse a string into appropriate arguments for child_process.spawn? 【发布时间】:2014-06-22 15:12:39 【问题描述】:我希望能够取一个命令字符串,例如:
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 上运行)。哈普?
【问题讨论】:
创建process.argv的不是node.js,而是你使用的shell解释器。所以它是系统依赖的。 bash 的解释会与 Windows cmd 不同。 @Michael:您找到任何解决方案了吗?我现在也面临同样的问题。 @Krasimir nope,从未找到明确的答案。我暂时还在用/bin/sh
。
如果您希望将命令行语句拆分为 args,那么 string-argv 或 spawn-args 可能会有所帮助。
【参考方案1】:
标准方法(无库)
您不必将命令字符串解析为参数,child_process.spawn
上有一个名为 shell
的选项。
options.shell
如果是 true
,则在 shell 内运行命令。
在 UNIX 上使用 /bin/sh
,在 Windows 上使用 cmd.exe
。
示例:
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'
【讨论】:
以上是关于如何将字符串解析为 child_process.spawn 的适当参数?的主要内容,如果未能解决你的问题,请参考以下文章