nodejs腳本中如何執(zhí)行shell命令
官方文檔:
Node.js v8.x 中文文檔:child_process - 子進(jìn)程
Node.js中使用內(nèi)置的child_process模塊來(lái)執(zhí)行shell命令。該模塊提供了exec、execFile、spawn等方法來(lái)啟動(dòng)子進(jìn)程并執(zhí)行命令
一:exec 方法執(zhí)行shell命令
1. 注意:
- exec 方法是將整個(gè)命令輸出緩存到內(nèi)存中,當(dāng)執(zhí)行完成后一次性返回,所以適合執(zhí)行較小的命令
- exec 方法的回調(diào)函數(shù)只有在命令執(zhí)行完成后才會(huì)被調(diào)用[持續(xù)性命令會(huì)導(dǎo)致回調(diào)函數(shù)不執(zhí)行]
第2點(diǎn)_舉例:
npm run dev
該命令會(huì)一直運(yùn)行,而 exec 方法的回調(diào)函數(shù)只有在命令運(yùn)行完成后才會(huì)被調(diào)用,導(dǎo)致你的回調(diào)函數(shù)一直沒(méi)有返回
2. 優(yōu)點(diǎn)特性:
- 優(yōu)點(diǎn)是簡(jiǎn)單易用,方便地執(zhí)行簡(jiǎn)單的命令,并且可以直接獲取命令輸出;
- 阻塞式調(diào)用的,當(dāng)命令輸出很大時(shí),可能會(huì)導(dǎo)致阻塞程序的執(zhí)行,甚至?xí)?dǎo)致程序崩潰
3. 語(yǔ)法格式
exec( '命令',option對(duì)象, 回調(diào)函數(shù)callback);
4. option對(duì)象屬性
- cwd <string> 子進(jìn)程的當(dāng)前工作目錄。
- env <Object> 環(huán)境變量鍵值對(duì)。
- encoding <string> 默認(rèn)為 ‘utf8’。
- shell <string> 執(zhí)行命令的 shell。在 UNIX 上默認(rèn)為 ‘/bin/sh’,在 Windows 上默認(rèn)為 process.env.ComSpec。詳見(jiàn)Shell的要求與Windows默認(rèn)的Shell。
- timeout <number> 默認(rèn)為 0。
- maxBuffer <number> stdout 或 stderr 允許的最大字節(jié)數(shù)。默認(rèn)為 200*1024。如果超過(guò)限制,則子進(jìn)程會(huì)被終止。詳見(jiàn) maxBuffer與Unicode。
- killSignal <string> | <integer> 默認(rèn)為 ‘SIGTERM’。
- uid<number>設(shè)置進(jìn)程的用戶標(biāo)識(shí),詳見(jiàn) setuid(2)。
- gid<number>設(shè)置進(jìn)程的組標(biāo)識(shí),詳見(jiàn) setgid(2)。
- windowsHide <boolean> 隱藏子進(jìn)程的控制臺(tái)窗口,常用于 Windows 系統(tǒng)。默認(rèn)為 false。
5. _示例:
Nodejs–標(biāo)識(shí)Node.js進(jìn)程運(yùn)行其上的操作系統(tǒng)平臺(tái): process.platform
const { exec } = require('child_process'); // 就是進(jìn)行簡(jiǎn)單`判斷`在執(zhí)行環(huán)境下應(yīng)該使用`哪個(gè)命令行`執(zhí)行命令; // process.platform : 標(biāo)識(shí)Node.js進(jìn)程運(yùn)行其上的操作系統(tǒng)平臺(tái) // 返回值:‘a(chǎn)ix',‘darwin',‘freebsd',‘linux',‘openbsd',‘sunos',‘win32' exec('ls -la',{shell:process.platform === 'win32'}, (error, stdout, stderr) => { if (error) { console.error(`執(zhí)行出錯(cuò): ${error}`); return; } console.log(`stdout: ${stdout}`); console.error(`stderr: ${stderr}`); });
回調(diào)函數(shù)有三個(gè)參數(shù):
error、stdout和stderr:
error
表示執(zhí)行命令時(shí)出現(xiàn)的錯(cuò)誤;stdout
表示命令的標(biāo)準(zhǔn)輸出;stderr
表示命令的標(biāo)準(zhǔn)錯(cuò)誤輸出;
二:spawn 方法 執(zhí)行shell命令
1. 注意:
- spawn方法執(zhí)行的命令參數(shù)應(yīng)該是一個(gè)Array。
- 這樣可以避免shell注入攻擊.
// 命令參數(shù)應(yīng)該是一個(gè)`數(shù)組` ['-la'] const ls = spawn('ls', ['-la'],{shell:process.platform === 'win32'},);
2. 優(yōu)點(diǎn)特性:
spawn 方法則是實(shí)時(shí)返回子進(jìn)程的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤流,適合執(zhí)行大量數(shù)據(jù)或者長(zhǎng)時(shí)間運(yùn)行的命令[ 例如 npm run dev ];
異步執(zhí)行的,可以在命令輸出時(shí)即時(shí)處理數(shù)據(jù),不會(huì)阻塞程序的執(zhí)行;
可以靈活地配置子進(jìn)程的輸入輸出、環(huán)境變量等選項(xiàng)
3. _語(yǔ)法格式:
const ls = spawn(命令String, 命令參數(shù)Array,option對(duì)象); ls.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); ls.stderr.on('data', (data) => { console.error(`stderr: ${data}`); }); ls.on('close', (code) => { console.log(`子進(jìn)程退出碼:$[code]`); });
4. option對(duì)象屬性
- cwd <string> 子進(jìn)程的當(dāng)前工作目錄。
- env<Object>環(huán)境變量鍵值對(duì)。
- argv0 <string> 顯式地設(shè)置要發(fā)給子進(jìn)程的 argv[0] 的值。 如果未指定,則設(shè)為 command。
- stdio<Array> | <string>子進(jìn)程的 stdio 配置。 (詳見(jiàn) options.stdio)
- detached <boolean> 準(zhǔn)備將子進(jìn)程獨(dú)立于父進(jìn)程運(yùn)行。 具體行為取決于平臺(tái)。(詳見(jiàn) [options.detached])
- uid <number> 設(shè)置該進(jìn)程的用戶標(biāo)識(shí)。(詳見(jiàn) setuid(2))
- gid <number> 設(shè)置該進(jìn)程的組標(biāo)識(shí)。(詳見(jiàn) setgid(2))
- shell <boolean> | <string> 如果為 true,則在一個(gè) shell 中運(yùn)行 command。 在 UNIX 上使用 '/bin/sh',在 - Windows 上使用 process.env.ComSpec。 一個(gè)不同的 shell 可以被指定為字符串。 See [Shell Requirements][] and [Default Windows Shell][]. 默認(rèn)為 false(沒(méi)有 shell)。
- windowsVerbatimArguments <boolean> 決定在Windows系統(tǒng)下是否使用轉(zhuǎn)義參數(shù)。 在Linux平臺(tái)下會(huì)自動(dòng)忽略,當(dāng)指令 shell 存在的時(shí)該屬性將自動(dòng)被設(shè)置為true。默認(rèn)值: false。
- windowsHide 是否隱藏在Windows系統(tǒng)下默認(rèn)會(huì)彈出的子進(jìn)程控制臺(tái)窗口。 默認(rèn)為: false。
【4.1 】 .stdio 屬性詳解 :配制在父進(jìn)程和子進(jìn)程之間建立的管道
- 配制在父進(jìn)程和子進(jìn)程之間建立的管道
- 影響到 shell 命令,或者 node 命令 在控制臺(tái)上的輸出
【屬性值格式 <Array> | <string> 】
['pipe', 'pipe', 'pipe'] (默認(rèn)值)
數(shù)組元素按位置分別對(duì)應(yīng):
- stdin
[命令的標(biāo)準(zhǔn)輸入]- stdout
[命令的標(biāo)準(zhǔn)輸出]- stderr
[執(zhí)行命令時(shí)出現(xiàn)的錯(cuò)誤]
'pipe', 'ignore', 'inherit
值 | 作用 |
---|---|
pipe | 父進(jìn)程中通過(guò) child_process.spawn.stdout.on(“data”, () => {}) 等獲取 |
ignore | 父進(jìn)程通過(guò)管道得到的是 null |
inherit | 子進(jìn)程將使用父進(jìn)程的標(biāo)準(zhǔn)輸入輸出 |
ls.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); ls.stderr.on('data', (data) => { console.error(`stderr: ${data}`); }); ls.on('close', (code) => { console.log(`子進(jìn)程退出碼:$[code]`); });
5. 示例:
const { spawn } = require('child_process'); // 就是進(jìn)行簡(jiǎn)單`判斷`在執(zhí)行環(huán)境下應(yīng)該使用`哪個(gè)命令行`執(zhí)行命令; // process.platform : 標(biāo)識(shí)Node.js進(jìn)程運(yùn)行其上的操作系統(tǒng)平臺(tái) // 返回值:‘a(chǎn)ix',‘darwin',‘freebsd',‘linux',‘openbsd',‘sunos',‘win32' const ls = spawn('ls', ['-la'],{shell:process.platform === 'win32'},); ls.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); ls.stderr.on('data', (data) => { console.error(`stderr: ${data}`); }); ls.on('close', (code) => { console.log(`子進(jìn)程退出碼:$[code]`); });
如果需要執(zhí)行一個(gè)復(fù)雜的shell命令:
可以使用sh命令,并將命令字符串作為參數(shù)傳遞給sh命令;
例如:
const { spawn } = require('child_process'); const command = 'ls -la | grep "example"'; const sh = spawn('sh', ['-c', command]); sh.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); sh.stderr.on('data', (data) => { console.error(`stderr: ${data}`); }); sh.on('close', (code) => { console.log(`子進(jìn)程退出碼:$[code]`); });
示例中:
- 我們使用sh命令執(zhí)行了一個(gè)包含管道的shell命令,并將該命令字符串作為參數(shù)傳遞給sh命令。
- 在spawn方法中,我們使用['-c', command]作為參數(shù)來(lái)啟動(dòng)sh命令
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用puppeteer破解極驗(yàn)的滑動(dòng)驗(yàn)證碼
這篇文章主要介紹了利用puppeteer破解極驗(yàn)的滑動(dòng)驗(yàn)證功能,基本流程代碼實(shí)現(xiàn)給大家介紹的非常詳細(xì),需要的朋友可以參考下2018-02-02nvm管理node無(wú)法正常切換node版本問(wèn)題的解決方法
相信一定會(huì)有存在一些小伙伴 明明都已經(jīng)按著操作卸載node 和安裝nvm 了但是 依舊無(wú)法正常通過(guò)nvm管理node,本文將給大家介紹nvm管理node無(wú)法正常切換node版本問(wèn)題的解決方法,需要的朋友可以參考下2024-01-01nodejs 實(shí)現(xiàn)釘釘ISV接入的加密解密方法
這篇文章主要介紹了nodejs 實(shí)現(xiàn)釘釘ISV接入的加密解密方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧,需要的朋友可以參考下2017-01-01node.JS的crypto加密模塊使用方法詳解(MD5,AES,Hmac,Diffie-Hellman加密)
本文將詳細(xì)介紹node.JS的加密模塊crypto實(shí)現(xiàn)MD5,AES,Hmac,Diffie-Hellman加密的詳解方法,需要的朋友可以參考下2020-02-02Node.js與npm版本兼容性問(wèn)題的原因及解決方案
在現(xiàn)代 Web 開(kāi)發(fā)中,Node.js 和 npm 是不可或缺的工具,然而,隨著 Node.js 和 npm 的快速發(fā)展,版本之間的兼容性問(wèn)題逐漸成為開(kāi)發(fā)者面臨的常見(jiàn)挑戰(zhàn),本文將深入探討 Node.js 和 npm 版本兼容性問(wèn)題,分析其產(chǎn)生的原因,并提供解決方案和最佳實(shí)踐,需要的朋友可以參考下2025-01-01Nodejs?Sequelize手冊(cè)學(xué)習(xí)快速入門到應(yīng)用
這篇文章主要為大家介紹了Nodejs?Sequelize手冊(cè)學(xué)習(xí)快速入門到應(yīng)用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10深入淺析Node.js 事件循環(huán)、定時(shí)器和process.nextTick()
這篇文章主要介紹了Node.js 事件循環(huán)、定時(shí)器和process.nextTick()的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10package.json版本號(hào)符號(hào)^和~前綴的區(qū)別
這篇文章介紹了package.json版本號(hào)符號(hào)^和~前綴的區(qū)別,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06