在 Node.js 中运行 bash

hop*_*mer 6 javascript bash child-process node.js

我需要启动bash终端,顺序执行多个命令,收集结果并退出。在nodejs中执行此操作的正确方法是什么?

我试图用它来实现这一点,child_process.spawn但即使使用单个命令,它也无法按照我的预期工作。

这是简化的代码:

const process = spawn(`bash`, [])

// wait for the process to spawn
await new Promise<void>(resolve => process.once(`spawn`, resolve))

// log any output (expected to be the current node version)
process.stdout.on(`data`, data => console.log(data))

// wait for "node --version" to execute
await new Promise<void>(resolve => process.stdin.write(`node --version\n`, `utf8`, () => resolve()))

// wait for the process to end
await new Promise<void>(resolve => process.once(`close`, resolve))
Run Code Online (Sandbox Code Playgroud)

stdout这里的问题是我在工作正常时没有收到任何输出await process.once('spawn')

我已经记录stderr了类似的所有其他事件process.onstdout.on('error')但它们都是空的。所以我想知道这里出了什么问题。

此外,谷歌有大量关于如何运行单个命令的示例。但我需要在同一个终端中运行几个,在每次调用之间等待并从中收集单独的结果。如果单个命令不能按预期工作,我不确定如何执行此操作。stdout

kon*_*box 3

有两件事可能会导致该问题。首先是最后一个代码resolve()立即执行,允许代码执行立即移至下一条指令。其次console.log(data)可能不足以打印输出。据我观察,data是一个Buffer,而不是一个字符串。


请尝试此代码,看看是否收到任何有用的消息:

const { spawn } = require('child_process');

async function main() {
  console.log("(console.log test)");
  const process = spawn(`bash`, [])

  // wait for the process to spawn
  await new Promise(resolve => process.once(`spawn`, resolve))

  // log any output (expected to be the current node version)
  process.stdout.on(`data`, data => console.log(data.toString()))
  
  // log any stderr
  process.stderr.on(`data`, data => console.log(data.toString()))

  // wait for "node --version" to execute
  await new Promise(resolve => process.stdin.write(`exec node --version\n`, `utf8`, () => resolve()))

  // wait for stdout and stderr stream to end, and process to close
  await Promise.all([
    new Promise(resolve => process.stdout.on('end', resolve)),
    new Promise(resolve => process.stderr.on('end', resolve)),
    new Promise(resolve => process.once(`close`, resolve))
  ])
}

main()
Run Code Online (Sandbox Code Playgroud)