1.说明
child_process
模块是 Node.js 的原始模块:
- 主要作用:执行命令行命令
- 该模块的功能主要由
child_process.spawn()
函数提供
2.区分exec和spawn
2-1 exec执行命令
const {
exec
} = require('child_process');
exec('ls -la /usr', (error, stdout, stderr) => {
console.log(error);
console.log(stdout);
console.log(stderr);
});
- 第一个参数是将要执行的命令,命令之间的参数使用空格分开
- 第二个参数是回调函数,有三个参数
回调中的第一个参数:命令执行错误会有值,否则为null
回调中的第二个参数:子进程的正常输出内容
回调中的第三个参数:子进程执行错误的输出
2-2 spawn命令
const {
spawn
} = require('child_process');
const ls = spawn('ls', ['-la', '/usr']);
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
ls.stderr.on('data', (data) => {
console.log(`stderr: ${data}`);
});
ls.on('close', (code) => {
console.log(`子进程退出码:${code}`);
});
- 第一个参数是命令
- 第二个参数是一个数组,数组中的每一个元素是执行命令需要的参数
需要特别注意的是,需要获取执行的内容需要通过流的形式来进行输出
2-3 两者对比
相同点:
- 都可以用来执行命令行命令
不同点:
- exec 用来执行命令,命令和命令后跟的参数是写在一个字符串中,作为函数的第一个参数
- spawn 用来执行命令,命令和命令后跟的参数是分开写的
- exec 的输出内容是在回调中输出的,一次性分配 200K 大小的内存空间,如果超出这个大小会报错
- spawn 的输出内容是通过流的形式进行输出的,没有分配空间,不会报错
总结:spawn 比 exec 使用范围要广,因此,能使用 spawn 的尽量使用 spawn。