node:运行shell的几种方式exec、spawn、shelljs

背景

有时候我们需要在 node 上运行一些 shell 脚本,看了下大概有这几种方式:

  • 官方提供的API:exec
  • 官方提供的API:spawn
  • 第三方库:shelljs

今天我们挨个来试用一下

官方提供的API:exec

官方文档
运行命令:cat *.js bad_file | wc -l

const { exec } = require('child_process');
exec('cat *.js bad_file | wc -l', (error, stdout, stderr) => {
  if (error) {
    console.error(`exec error: ${error}`);
    return;
  }
  console.log(`stdout: ${stdout}`);
  console.log(`stderr: ${stderr}`);
});

这种写法要注意不接受外部输入的命令直接执行。

注意,命令执行的结果是通过 node 代码 console 出来的,否则不会有打印效果。

官方提供的API:spawn

运行命令:ls -lh /usr

const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/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}`);
});

如果有外部属于命令的需求,这种写法能避免,但是缺点也是写法比较繁琐。

第三方库:shelljs

官方文档

var shell = require('shelljs');

if (!shell.which('git')) {
  shell.echo('Sorry, this script requires git');
  shell.exit(1);
}

// Copy files to release dir
shell.rm('-rf', 'out/Release');
shell.cp('-R', 'stuff/', 'out/Release');

// Replace macros in each .js file
shell.cd('lib');
shell.ls('*.js').forEach(function (file) {
  shell.sed('-i', 'BUILD_VERSION', 'v0.1.2', file);
  shell.sed('-i', /^.*REMOVE_THIS_LINE.*$/, '', file);
  shell.sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, shell.cat('macro.js'), file);
});
shell.cd('..');

// Run external tool synchronously
if (shell.exec('git commit -am "Auto-commit"').code !== 0) {
  shell.echo('Error: Git commit failed');
  shell.exit(1);
}

你可能感兴趣的:(#,nodeJS,前端,javascript,npm)