如何将字符串解析为 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 的适当参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串解析为 java.sql.date

如何将字符串解析为无类型

如何将 JSON 字符串解析为 ListView?

python解析excel,如何将long转换为字符串? [复制]

如何将数组中的真假字符串解析为布尔值

如何将字符串转换为 JSON,以便我可以将其解析为对象