產生一個 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}`);