likes
comments
collection
share

node中执行脚本

作者站长头像
站长
· 阅读数 3

一般在node 中执行脚本,主要是用在构建工具、任务自动化、自动部署、数据批处理、自定义工具等。 那么其中最基础的功能,是node如何快速运行脚本。除了常规使用命令行窗口(cmd,bash等)运行,还有其他方式执行,本文就简单列举几种常用方式处理。

1、package.json的scripts

直接通过package.json的scripts来运行对应指令

  • package.json文件中的scripts字段用于定义一组自定义的脚本命令
  • 可以通过 npmyarn等命令来执行

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}`);
});

参考