產生一個 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
是傳送以終止它的訊號。
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}`);