Node.js 产生一个shell来执行命令

示例

要在需要缓冲输出(即不是流)的shell中运行命令,请使用child_process.exec。例如,如果您想运行cat *.js file | wc -l不带任何选项的命令,则如下所示:

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

  console.log(`stdout: ${stdout}`);
  console.log(`stderr: ${stderr}`);
});

该函数最多接受三个参数:

child_process.exec(command[, options][, callback]);

command参数是一个字符串,是必需的,而options对象和callback都是可选的。如果未指定选项对象,则将exec以下内容用作默认值:

{
  encoding: 'utf8',
  timeout: 0,
  maxBuffer: 200*1024,
  killSignal: 'SIGTERM',
  cwd: null,
  env: null
}

options对象还支持一个shell参数(/bin/sh在UNIX和cmd.exeWindows上默认uid为该参数),一个用于设置进程的用户标识的gid选项以及一个用于组标识的选项。

使用三个参数调用该回调,该回调在命令执行完成时调用(err, stdout, stderr)。如果命令成功执行,err将是null,否则将是的一个实例Error,它err.code是该进程的退出代码,并且err.signal是为终止该进程而发送的信号。

的stdout和stderr参数是命令的输出。它使用options对象中指定的编码解码(默认值:)string,但是可以作为Buffer对象返回。

还存在的同步版本exec,即execSync。同步版本不接受回调,stdout而是返回而不是的实例ChildProcess。如果同步版本遇到错误,它引发和终止程序。看起来像这样:

const execSync = require('child_process').execSync;
const stdout = execSync('cat *.js file | wc -l');
console.log(`stdout: ${stdout}`);