产生一个 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 参数,默认情况下为 UNIX 上的/bin/sh 和 Windows 上的 cmd.exe,用于设置进程用户身份的 uid 选项,以及用于组标识的 gid 选项。

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

stdoutstderr 参数是命令的输出。它使用 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}`);