gpt4 book ai didi

javascript - 在 Node js 中运行 bash

转载 作者:行者123 更新时间:2023-12-05 04:38:34 26 4
gpt4 key购买 nike

我需要启动 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))

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

我已经记录了 stderr 和所有其他事件,例如 process.onstdout.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()

关于javascript - 在 Node js 中运行 bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70579249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com