最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

nodejs腳本中如何執(zhí)行shell命令

 更新時間:2025年02月06日 10:02:15   作者:Amber.Li  
Node.js中使用child_process模塊的exec和spawn方法來執(zhí)行shell命令,exec適合執(zhí)行小命令,返回輸出;spawn適合大命令或長時間運行的命令,實時輸出

官方文檔:

Node.js v8.x 中文文檔:child_process - 子進(jìn)程

Node.js中使用內(nèi)置的child_process模塊來執(zhí)行shell命令。該模塊提供了exec、execFile、spawn等方法來啟動子進(jìn)程并執(zhí)行命令

一:exec 方法執(zhí)行shell命令

1. 注意:

  • exec 方法是將整個命令輸出緩存到內(nèi)存中,當(dāng)執(zhí)行完成后一次性返回,所以適合執(zhí)行較小的命令
  • exec 方法的回調(diào)函數(shù)只有在命令執(zhí)行完成后才會被調(diào)用[持續(xù)性命令會導(dǎo)致回調(diào)函數(shù)不執(zhí)行]

第2點_舉例:

npm run dev

該命令會一直運行,而 exec 方法的回調(diào)函數(shù)只有在命令運行完成后才會被調(diào)用,導(dǎo)致你的回調(diào)函數(shù)一直沒有返回

2. 優(yōu)點特性:

  • 優(yōu)點是簡單易用,方便地執(zhí)行簡單的命令,并且可以直接獲取命令輸出;
  • 阻塞式調(diào)用的,當(dāng)命令輸出很大時,可能會導(dǎo)致阻塞程序的執(zhí)行,甚至?xí)?dǎo)致程序崩潰

3. 語法格式

exec( '命令',option對象, 回調(diào)函數(shù)callback);

4. option對象屬性

  • cwd <string> 子進(jìn)程的當(dāng)前工作目錄。
  • env <Object> 環(huán)境變量鍵值對。
  • encoding <string> 默認(rèn)為 ‘utf8’。
  • shell <string> 執(zhí)行命令的 shell。在 UNIX 上默認(rèn)為 ‘/bin/sh’,在 Windows 上默認(rèn)為 process.env.ComSpec。詳見Shell的要求與Windows默認(rèn)的Shell。
  • timeout <number> 默認(rèn)為 0。
  • maxBuffer <number> stdout 或 stderr 允許的最大字節(jié)數(shù)。默認(rèn)為 200*1024。如果超過限制,則子進(jìn)程會被終止。詳見 maxBuffer與Unicode。
  • killSignal <string> | <integer> 默認(rèn)為 ‘SIGTERM’。
  • uid<number>設(shè)置進(jìn)程的用戶標(biāo)識,詳見 setuid(2)。
  • gid<number>設(shè)置進(jìn)程的組標(biāo)識,詳見 setgid(2)。
  • windowsHide <boolean> 隱藏子進(jìn)程的控制臺窗口,常用于 Windows 系統(tǒng)。默認(rèn)為 false。

5. _示例:

Nodejs–標(biāo)識Node.js進(jìn)程運行其上的操作系統(tǒng)平臺: process.platform

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

 // 就是進(jìn)行簡單`判斷`在執(zhí)行環(huán)境下應(yīng)該使用`哪個命令行`執(zhí)行命令;
 // process.platform : 標(biāo)識Node.js進(jìn)程運行其上的操作系統(tǒng)平臺
 // 返回值:‘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í)行出錯: ${error}`);
    return;
  }
  console.log(`stdout: ${stdout}`);
  console.error(`stderr: ${stderr}`);
});

回調(diào)函數(shù)有三個參數(shù):

error、stdout和stderr:

  • error表示執(zhí)行命令時出現(xiàn)的錯誤;
  • stdout表示命令的標(biāo)準(zhǔn)輸出;
  • stderr表示命令的標(biāo)準(zhǔn)錯誤輸出;

二:spawn 方法 執(zhí)行shell命令

1. 注意:

  • spawn方法執(zhí)行的命令參數(shù)應(yīng)該是一個Array。
  • 這樣可以避免shell注入攻擊.
// 命令參數(shù)應(yīng)該是一個`數(shù)組`  ['-la']
const ls = spawn('ls', ['-la'],{shell:process.platform === 'win32'},);

2. 優(yōu)點特性:

spawn 方法則是實時返回子進(jìn)程的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤流,適合執(zhí)行大量數(shù)據(jù)或者長時間運行的命令[ 例如 npm run dev ];

異步執(zhí)行的,可以在命令輸出時即時處理數(shù)據(jù),不會阻塞程序的執(zhí)行;

可以靈活地配置子進(jìn)程的輸入輸出、環(huán)境變量等選項

3. _語法格式:

const ls = spawn(命令String, 命令參數(shù)Array,option對象);

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對象屬性

  • cwd <string> 子進(jìn)程的當(dāng)前工作目錄。
  • env<Object>環(huán)境變量鍵值對。
  • argv0 <string> 顯式地設(shè)置要發(fā)給子進(jìn)程的 argv[0] 的值。 如果未指定,則設(shè)為 command。
  • stdio<Array> | <string>子進(jìn)程的 stdio 配置。 (詳見 options.stdio)
  • detached <boolean> 準(zhǔn)備將子進(jìn)程獨立于父進(jìn)程運行。 具體行為取決于平臺。(詳見 [options.detached])
  • uid <number> 設(shè)置該進(jìn)程的用戶標(biāo)識。(詳見 setuid(2))
  • gid <number> 設(shè)置該進(jìn)程的組標(biāo)識。(詳見 setgid(2))
  • shell <boolean> | <string> 如果為 true,則在一個 shell 中運行 command。 在 UNIX 上使用 '/bin/sh',在 - Windows 上使用 process.env.ComSpec。 一個不同的 shell 可以被指定為字符串。 See [Shell Requirements][] and [Default Windows Shell][]. 默認(rèn)為 false(沒有 shell)。
  • windowsVerbatimArguments <boolean> 決定在Windows系統(tǒng)下是否使用轉(zhuǎn)義參數(shù)。 在Linux平臺下會自動忽略,當(dāng)指令 shell 存在的時該屬性將自動被設(shè)置為true。默認(rèn)值: false。
  • windowsHide 是否隱藏在Windows系統(tǒng)下默認(rèn)會彈出的子進(jìn)程控制臺窗口。 默認(rèn)為: false。

【4.1 】 .stdio 屬性詳解 :配制在父進(jìn)程和子進(jìn)程之間建立的管道

  • 配制在父進(jìn)程和子進(jìn)程之間建立的管道
  • 影響到 shell 命令,或者 node 命令 在控制臺上的輸出

【屬性值格式 <Array> | <string> 】

['pipe', 'pipe', 'pipe'] (默認(rèn)值)

數(shù)組元素按位置分別對應(yīng):

  • - stdin [命令的標(biāo)準(zhǔn)輸入]
  • - stdout [命令的標(biāo)準(zhǔn)輸出]
  • - stderr [執(zhí)行命令時出現(xiàn)的錯誤]

'pipe', 'ignore', 'inherit

作用
pipe父進(jìn)程中通過 child_process.spawn.stdout.on(“data”, () => {}) 等獲取
ignore父進(jìn)程通過管道得到的是 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)行簡單`判斷`在執(zhí)行環(huán)境下應(yīng)該使用`哪個命令行`執(zhí)行命令;
// process.platform : 標(biāo)識Node.js進(jìn)程運行其上的操作系統(tǒng)平臺
// 返回值:‘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í)行一個復(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í)行了一個包含管道的shell命令,并將該命令字符串作為參數(shù)傳遞給sh命令。
  • 在spawn方法中,我們使用['-c', command]作為參數(shù)來啟動sh命令

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • nodejs模塊nodemailer基本使用-郵件發(fā)送示例(支持附件)

    nodejs模塊nodemailer基本使用-郵件發(fā)送示例(支持附件)

    本篇文章主要介紹了nodejs模塊nodemailer基本使用-郵件發(fā)送示例(支持附件),具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • node.js mongoose index索引操作

    node.js mongoose index索引操作

    在 Mongoose 中,索引(Index)是一種用于提高查詢性能的數(shù)據(jù)結(jié)構(gòu),它可以加速對數(shù)據(jù)庫中文檔的檢索操作,本文給大家介紹
    node.js mongoose index索引操作
    ,感興趣的朋友一起看看吧
    2023-12-12
  • Node.js獲取前端ajax提交的request信息

    Node.js獲取前端ajax提交的request信息

    這篇文章主要為大家詳細(xì)介紹了Node.js獲取前端ajax提交的request信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • nodejs 提示‘xxx’ 不是內(nèi)部或外部命令解決方法

    nodejs 提示‘xxx’ 不是內(nèi)部或外部命令解決方法

    本文介紹了node.js包管理工具npm安裝模塊后,無法通過命令行執(zhí)行命令,提示‘xxx’ 不是內(nèi)部或外部命令的解決方法,給需要的小伙伴參考下。
    2014-11-11
  • Node.js下自定義錯誤類型詳解

    Node.js下自定義錯誤類型詳解

    在JavaScript里面,運行過程中的錯誤的類型總是被人忽略,這篇文章給大家詳細(xì)介紹了如何在Node.js下自定義錯誤類型,對大家學(xué)習(xí)或者使用Node.js具有一定的參考借鑒價值,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-10-10
  • nodejs基礎(chǔ)之常用工具模塊util用法分析

    nodejs基礎(chǔ)之常用工具模塊util用法分析

    這篇文章主要介紹了nodejs基礎(chǔ)之常用工具模塊util用法,結(jié)合實例形式分析了nodejs核心工具模塊util功能、相關(guān)函數(shù)與使用方法,需要的朋友可以參考下
    2018-12-12
  • 快速搭建Node.js(Express)用戶注冊、登錄以及授權(quán)的方法

    快速搭建Node.js(Express)用戶注冊、登錄以及授權(quán)的方法

    這篇文章主要介紹了快速搭建Node.js(Express)用戶注冊、登錄以及授權(quán),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • npm?install安裝過程報錯的實用解決辦法

    npm?install安裝過程報錯的實用解決辦法

    最近做項目遇到npm install 的問題,下面這篇文章主要給大家介紹了關(guān)于npm?install安裝過程報錯的實用解決辦法,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Node.js查詢MySQL并返回結(jié)果集給客戶端的全過程

    Node.js查詢MySQL并返回結(jié)果集給客戶端的全過程

    nodejs最大的優(yōu)勢也是大家用著最為難以理解的一點,就是它的異步功能,它幾乎所有的io操作都是異步的,這也就導(dǎo)致很多人不理解也用不習(xí)慣,下面這篇文章主要給大家介紹了關(guān)于Node.js查詢MySQL并返回結(jié)果集給客戶端的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • Node.js利用斷言模塊assert進(jìn)行單元測試的方法

    Node.js利用斷言模塊assert進(jìn)行單元測試的方法

    最近在用Node寫一個實時聊天小應(yīng)用,其中就用到了單元測試,所以死下面這篇文章主要給大家介紹了關(guān)于Node.js利用斷言模塊assert進(jìn)行單元測試的方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09

最新評論

青阳县| 嘉祥县| 龙门县| 普洱| 游戏| 莱芜市| 九江市| 昌都县| 通城县| 宁波市| 仪陇县| 榕江县| 泰来县| 依兰县| 鄢陵县| 凤庆县| 镶黄旗| 溧阳市| 福州市| 随州市| 当雄县| 梅河口市| 濮阳县| 弥勒县| 乐业县| 陇西县| 深泽县| 崇州市| 博白县| 清水河县| 临海市| 苗栗县| 铁岭市| 韩城市| 济南市| 万山特区| 德保县| 云林县| 徐州市| 中阳县| 瓮安县|