我找到了另一种方法来做它:
const { spawn } = require('child_process');
export const execCommand = async (command) => {
return new Promise((resolve, reject) => {
const [cmd, ...args] = command.split(' ');
const childProcess = spawn(cmd, args);
childProcess.stdout.on('data', (data) => {
process.stdout.write(data.toString());
});
childProcess.stderr.on('data', (data) => {
process.stderr.write(data.toString());
});
childProcess.on('error', (error) => {
reject(error);
});
childProcess.on('exit', (code) => {
if (code === 0) {
resolve();
} else {
reject(new Error(`Command exited with code ${code}.`));
}
});
});
};
这段代码提供了实时获取执行命令的输出并将所有标准输出和标准错误重定向到父进程的能力。它还允许像在bash/sh中使用命令一样使用该命令(单个字符串输入)。在这里,我使用process.stdout.write
来获得更精确的输出,而不是其他答案中使用的console.log
。
用法:
await execCommand('sudo apt-get update');
await execCommand('sudo apt-get install -y docker.io docker-compose');
注意:与
exec
相比,它不支持使用
&&
执行多个命令。因此,每个单独的命令都应该使用一个
execCommand
语句来执行。
这里有一个简化版本,支持实时流和shell执行:
const { spawn } = require('child_process');
export const execCommand = async (command) => {
return new Promise((resolve, reject) => {
const childProcess = spawn(command, {
stdio: 'inherit',
shell: true
});
childProcess.on('error', (error) => {
reject(error);
});
childProcess.on('exit', (code) => {
if (code === 0) {
resolve();
} else {
reject(new Error(`Command exited with code ${code}.`));
}
});
});
};
使用方法:
await execCommand('sudo apt-get update && sudo apt-get install -y docker.io docker-compose');