nodejs脚本中如何执行shell命令
目录
官方文档:
Node.js v8.x 中文文档:child_process - 子进程
Node.js中使用内置的child_process模块来执行shell命令。该模块提供了exec、execFile、spawn等方法来启动子进程并执行命令
一:exec 方法执行shell命令
1. 注意:
- exec 方法是将整个命令输出缓存到内存中,当执行完成后一次性返回,所以适合执行较小的命令
- exec 方法的回调函数只有在命令执行完成后才会被调用[持续性命令会导致回调函数不执行]
第2点_举例:
npm run dev
该命令会一直运行,而 exec 方法的回调函数只有在命令运行完成后才会被调用,导致你的回调函数一直没有返回
2. 优点特性:
- 优点是简单易用,方便地执行简单的命令,并且可以直接获取命令输出;
- 阻塞式调用的,当命令输出很大时,可能会导致阻塞程序的执行,甚至会导致程序崩溃
3. 语法格式
exec( '命令',option对象, 回调函数callback);
4. option对象属性
- cwd
子进程的当前工作目录。 - env
- encoding
默认为 ‘utf8’。 - shell
执行命令的 shell。在 UNIX 上默认为 ‘/bin/sh’,在 Windows 上默认为 process.env.ComSpec。详见Shell的要求与Windows默认的Shell。 - timeout
默认为 0。 - maxBuffer
stdout 或 stderr 允许的最大字节数。默认为 200*1024。如果超过限制,则子进程会被终止。详见 maxBuffer与Unicode。 - killSignal
| 默认为 ‘SIGTERM’。 - uid
设置进程的用户标识,详见 setuid(2)。 - gid
设置进程的组标识,详见 setgid(2)。 - windowsHide
隐藏子进程的控制台窗口,常用于 Windows 系统。默认为 false。
5. _示例:
Nodejs–标识Node.js进程运行其上的操作系统平台: process.platform
const { exec } = require('child_process'); // 就是进行简单`判断`在执行环境下应该使用`哪个命令行`执行命令; // process.platform : 标识Node.js进程运行其上的操作系统平台 // 返回值:‘aix',‘darwin',‘freebsd',‘linux',‘openbsd',‘sunos',‘win32' exec('ls -la',{shell:process.platform === 'win32'}, (error, stdout, stderr) => { if (error) { console.error(`执行出错: ${error}`); return; } console.log(`stdout: ${stdout}`); console.error(`stderr: ${stderr}`); });
回调函数有三个参数:
error、stdout和stderr:
error
表示执行命令时出现的错误;stdout
表示命令的标准输出;stderr
表示命令的标准错误输出;
二:spawn 方法 执行shell命令
1. 注意:
- spawn方法执行的命令参数应该是一个Array。
- 这样可以避免shell注入攻击.
// 命令参数应该是一个`数组` ['-la'] const ls = spawn('ls', ['-la'],{shell:process.platform === 'win32'},);
2. 优点特性:
spawn 方法则是实时返回子进程的标准输出和标准错误流,适合执行大量数据或者长时间运行的命令[ 例如 npm run dev ];
异步执行的,可以在命令输出时即时处理数据,不会阻塞程序的执行;
可以灵活地配置子进程的输入输出、环境变量等选项
3. _语法格式:
const ls = spawn(命令String, 命令参数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(`子进程退出码:$[code]`); });
4. option对象属性
- cwd
子进程的当前工作目录。 - env
- argv0
显式地设置要发给子进程的 argv[0] 的值。 如果未指定,则设为 command。 - stdio
| 子进程的 stdio 配置。 (详见 options.stdio) - detached
准备将子进程独立于父进程运行。 具体行为取决于平台。(详见 [options.detached]) - uid
设置该进程的用户标识。(详见 setuid(2)) - gid
设置该进程的组标识。(详见 setgid(2)) - shell
| 如果为 true,则在一个 shell 中运行 command。 在 UNIX 上使用 '/bin/sh',在 - Windows 上使用 process.env.ComSpec。 一个不同的 shell 可以被指定为字符串。 See [Shell Requirements][] and [Default Windows Shell][]. 默认为 false(没有 shell)。 - windowsVerbatimArguments
决定在Windows系统下是否使用转义参数。 在Linux平台下会自动忽略,当指令 shell 存在的时该属性将自动被设置为true。默认值: false。 - windowsHide 是否隐藏在Windows系统下默认会弹出的子进程控制台窗口。 默认为: false。
【4.1 】 .stdio 属性详解 :配制在父进程和子进程之间建立的管道
- 配制在父进程和子进程之间建立的管道
- 影响到 shell 命令,或者 node 命令 在控制台上的输出
【属性值格式
['pipe', 'pipe', 'pipe'] (默认值)
数组元素按位置分别对应:
- stdin
[命令的标准输入]- stdout
[命令的标准输出]- stderr
[执行命令时出现的错误]
'pipe', 'ignore', 'inherit
ls.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); ls.stderr.on('data', (data) => { console.error(`stderr: ${data}`); }); ls.on('close', (code) => { console.log(`子进程退出码:$[code]`); });
5. 示例:
const { spawn } = require('child_process'); // 就是进行简单`判断`在执行环境下应该使用`哪个命令行`执行命令; // process.platform : 标识Node.js进程运行其上的操作系统平台 // 返回值:‘aix',‘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(`子进程退出码:$[code]`); });
如果需要执行一个复杂的shell命令:
可以使用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(`子进程退出码:$[code]`); });
示例中:
- 我们使用sh命令执行了一个包含管道的shell命令,并将该命令字符串作为参数传递给sh命令。
- 在spawn方法中,我们使用['-c', command]作为参数来启动sh命令
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持科站长。
上一篇:Vue3的el-table-column增加跳转其他页面的方法
栏 目:JavaScript
本文标题:nodejs脚本中如何执行shell命令
本文地址:https://www.fushidao.cc/wangluobiancheng/3158.html
您可能感兴趣的文章
- 02-11js中基本事件的总结(onclick、onblur、onchange等)
- 02-11详解如何在Node.js中使用中间件处理请求
- 02-11Vue3中Provide和Inject的用法及工作原理详解
- 02-11Vue+vant实现图片上传添加水印
- 02-11快速解决 keep-alive 缓存组件中定时器干扰问题
- 02-11uniapp 使用 tree.js 解决模型加载不出来的问题及解决方法
- 02-11基于uniapp vue3 的滑动抢单组件实例代码
- 02-10JavaScript 中的 Map使用指南
- 02-10vue3中使用print-js组件实现打印操作步骤
- 02-10Vue 中v-model的完整用法及v-model的实现原理解析


阅读排行
推荐教程
- 04-23JavaScript Array实例方法flat的实现
- 04-23THREE.JS使用TransformControls对模型拖拽的代码实例
- 04-23Vue3使用v-if指令进行条件渲染的实例代码
- 04-23vue3+ts项目搭建的实现示例
- 04-23JavaScript实现下载超大文件的方法详解
- 04-23vue如何使用pdf.js实现在线查看pdf文件功能
- 04-23vue.js调用python脚本并给脚本传数据
- 12-18使用JavaScript遍历输出页面中的所有元素的方法详解
- 04-23JS加密解密之保存到桌面书签
- 12-18Vue实现滚动加载更多效果的示例代码