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.on,stdout.on('error')但它们都是空的。所以我想知道这里出了什么问题。
此外,谷歌有大量关于如何运行单个命令的示例。但我需要在同一个终端中运行几个,在每次调用之间等待并从中收集单独的结果。如果单个命令不能按预期工作,我不确定如何执行此操作。stdout
有两件事可能会导致该问题。首先是最后一个代码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)
| 归档时间: |
|
| 查看次数: |
7013 次 |
| 最近记录: |