node中执行脚本
一般在node 中执行脚本,主要是用在构建工具、任务自动化、自动部署、数据批处理、自定义工具等。 那么其中最基础的功能,是node如何快速运行脚本。除了常规使用命令行窗口(
cmd
,bash
等)运行,还有其他方式执行,本文就简单列举几种常用方式处理。
1、package.json的scripts
直接通过package.json的scripts
来运行对应指令
package.json
文件中的scripts
字段用于定义一组自定义的脚本命令- 可以通过
npm
、yarn
等命令来执行
2、child_process
模块的 exec
exec
函数将整个命令行字符串传递给底层的操作系统shell
执行。它将命令的输出保存在缓冲区中,直到命令执行完毕,然后一次性返回输出结果。因此,如果命令的输出非常大,可能会占用较多的内存- 使用
shell
来执行命令,因此可以使用shell
的特性,如通配符、管道等 - 处理执行简单的命令,不需要实时输出
- 命令字符串传递给
shell
进行解析和执行,这可能会导致一些安全问题,如shell
注入攻击
#./out.sh
echo hello world
const { exec } = require('child_process');
exec('sh ./out.sh', (error, stdout, stderr) => {
if (error) {
console.error(`执行命令错误error: ${error}`);
return;
}
if (stderr) {
console.log(`命令输出错误stderr: ${stderr}`);
return;
}
console.log(`命令输出结果stdout: ${stdout}`);
});
3、 child_process
模块的 spawn
spawn
函数提供了流式处理输入和输出的能力。它创建了一个新的子进程,并通过流的方式将命令的输入和输出连接到父进程。这使得可以实时地读取和写入数据。你可以通过事件监听器处理标准输出、标准错误输出和命令的退出事件- 实时处理命令输出
const { spawn } = require('child_process');
const command = 'sh';
const args = ['./out.sh'];
const childProcess = spawn(command, args);
// 监听命令的标准输出
childProcess.stdout.on('data', (data) => {
console.log(`命令输出结果: ${data}`);
});
// 监听命令的标准错误输出
childProcess.stderr.on('data', (data) => {
console.error(`命令输出错误: ${data}`);
});
// 监听命令的退出事件
childProcess.on('close', (code) => {
console.log(`命令执行完毕,退出码: ${code}`);
});
4、child_process
模块的 execFile
execFile
不使用操作系统 shell,直接执行指定的可执行文件- 可以避免
shell
的一些风险
const { execFile } = require('child_process');
execFile('sh', ['./out.sh'], (error, stdout, stderr) => {
if (error) {
console.error(`执行命令错误error: ${error}`);
return;
}
if (stderr) {
console.log(`命令输出错误stderr: ${stderr}`);
return;
}
console.log(`命令输出结果stdout: ${stdout}`);
});
参考
转载自:https://juejin.cn/post/7352387578908688436