Node.js執行系統命令

EulerChen發表於2019-03-04
Node.js執行系統命令

原文發表在我的部落格 Node.js 執行系統命令 | 以太空間

  我們在使用Node.js的時候總有一些時候需要執行一些系統命令,與系統做一些互動,或者呼叫其他語言,這個時候該怎麼做呢?
  當然是使用child_process模組了,這個模組翻譯過來就是子程式,當然正如其名,這個模組主要是通過產生子程式來發揮作用,下面我們就用例項來看一下。

一、execexecSync

  這是child_process模組裡面最簡單的函式,作用就是執行一個固定的系統命令

const { exec } = require(`child_process`);
// 輸出當前目錄(不一定是程式碼所在的目錄)下的檔案和資料夾
exec(`ls -l`, (err, stdout, stderr) => {
    if(err) {
        console.log(err);
        return;
    }
    console.log(`stdout: ${stdout}`);
    console.log(`stderr: ${stderr}`);
})
複製程式碼

  exec函式第一個引數是要執行的命令,的第二個函式是配置選項,第三個引數是回撥函式,第二個引數中一個比較常用的就是子程式的工作目錄

const { exec } = require(`child_process`);
const path = require(`path`):
// 在當前目錄下的scripts資料夾裡執行hexo g命令
exec(`hexo g`, { cwd: path.join(process.cwd(), `scripts`) }, (err, stdout, stderr) => {
    if(err) {
        console.log(err);
        return;
    }
    console.log(`stdout: ${stdout}`);
});
複製程式碼

  execSyncexec的同步版本,不過無論是execSync還是exec,得到的結果都是字串或者Buffer物件,一般需要進一步處理。

請參考:exec具體配置execSync具體配置

二、execFileexecFileSync

  這兩個函式的作用是執行一個可執行檔案,看下面的例項:

const { execFile, execFileSync } = require(`child_process`);

execFile(`example.py`, [], (err, stdout, stderr) => {
    if(err) {
        console.log(err);
        return;
    }
    console.log(`stdout: ${stdout}`);
});

const stdout = execFileSync(`node`, [`-v`]);
console.log(stdout);
複製程式碼

  跟exec類似,第一個引數是要執行的檔案路徑,第二個是引數陣列,第三個是配置,第四個是回撥函式,當然,除了第一個之外都是可以省略的

注意:被執行的檔案一定要有可執行許可權,如果是類似.py類的特定語言的指令碼,一定在開頭指定直譯器程式路徑

請參考:execFile配置execFileSync配置

三、spawnspawnSync

  child_process模組中所有函式都是基於spawnspawnSync函式的來實現的,換句話來說,spawnspawnSync函式的配置是最完全的,其它函式都是對其做了封裝和修改。下面我們來重點講解一下:
  spawn函式原型是這樣的:child_process.spawn(command[, args][, options])

  它使用指定的命令列引數建立新程式,spawn 會返回一個帶有stdout和stderr流的物件。你可以通過stdout流來讀取子程式返回給Node.js的資料。stdout擁有`data`,`end`以及一般流所具有的事件。當你想要子程式返回大量資料給Node時,比如說影像處理,讀取二進位制資料等等,你最好使用spawn方法

const {spawn}  = require(`child_process`);
const fs = require(`fs`);
const spawnObj = spawn(`ping`, [`127.0.0.1`], {encoding: `utf-8`});
spawnObj.stdout.on(`data`, function(chunk) {
    console.log(chunk.toString());
});
spawnObj.stderr.on(`data`, (data) => {
  console.log(data);
});
spawnObj.on(`close`, function(code) {
    console.log(`close code : ` + code);
})
spawnObj.on(`exit`, (code) => {
    console.log(`exit code : ` + code);
    fs.close(fd, function(err) {
        if(err) {
            console.error(err);
        }
    });
});
複製程式碼

相關文章