當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Node.js child_process.exec(command[, options][, callback])用法及代碼示例

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

曆史
版本變化
v15.4.0

添加了AbortSignal 支持。

v16.4.0、v14.18.0

cwd 選項可以是使用 file: 協議的 WHATWG URL 對象。

v8.8.0

現在支持windowsHide 選項。

v0.1.90

添加於:v0.1.90


參數

生成一個 shell,然後在該 shell 中執行 command,緩衝任何生成的輸出。傳遞給 exec 函數的 command 字符串由 shell 直接處理,特殊字符(根據 shell 不同)需要相應處理:

const { exec } = require('node:child_process');

exec('"/path/to/test file/test.sh" arg1 arg2');
// Double quotes are used so that the space in the path is not interpreted as
// a delimiter of multiple arguments.

exec('echo "The \\$HOME variable is $HOME"');
// The $HOME variable is escaped in the first instance, but not in the second.

切勿將未經處理的用戶輸入傳遞給此函數。任何包含 shell 元字符的輸入都可用於觸發任意命令執行。

如果提供了 callback 函數,則使用參數 (error, stdout, stderr) 調用它。成功後,error 將是 null 。出錯時,error 將是 Error 的一個實例。 error.code 屬性將是進程的退出代碼。按照慣例,0 以外的任何退出代碼都表示錯誤。 error.signal 將是終止進程的信號。

傳遞給回調的 stdoutstderr 參數將包含子進程的 stdout 和 stderr 輸出。默認情況下,Node.js 會將輸出解碼為 UTF-8 並將字符串傳遞給回調。 encoding 選項可用於指定用於解碼 stdout 和 stderr 輸出的字符編碼。如果 encoding'buffer' 或無法識別的字符編碼,則將 Buffer 對象傳遞給回調。

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

如果 timeout 大於 0 ,如果孩子運行時間超過 timeout 毫秒,則父母將發送由 killSignal 屬性標識的信號(默認為 'SIGTERM' )。

exec(3) POSIX 係統調用不同,child_process.exec() 不會替換現有進程,而是使用 shell 來執行命令。

如果此方法作為其 util.promisify() ed 版本調用,它會為具有 stdoutstderr 屬性的 Object 返回 Promise。返回的ChildProcess 實例作為child 屬性附加到Promise。如果發生錯誤(包括導致退出代碼不是 0 的任何錯誤),將返回一個被拒絕的 promise,並在回調中給出相同的 error 對象,但具有兩個附加屬性 stdoutstderr

const util = require('node:util');
const exec = util.promisify(require('node:child_process').exec);

async function lsExample() {
  const { stdout, stderr } = await exec('ls');
  console.log('stdout:', stdout);
  console.error('stderr:', stderr);
}
lsExample();

如果啟用了 signal 選項,則在相應的 AbortController 上調用 .abort() 與在子進程上調用 .kill() 類似,隻是傳遞給回調的錯誤將是 AbortError

const { exec } = require('node:child_process');
const controller = new AbortController();
const { signal } = controller;
const child = exec('grep ssh', { signal }, (error) => {
  console.log(error); // an AbortError
});
controller.abort();

相關用法


注:本文由純淨天空篩選整理自nodejs.org大神的英文原創作品 child_process.exec(command[, options][, callback])。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。