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``````<string>
子进程的当前工作目录。- env
<Object>
环境变量键值对。 - encoding
<string>
默认为 ‘utf8’。 shell``````<string>
执行命令的 shell。在 UNIX 上默认为 ‘/bin/sh’,在 Windows 上默认为 process.env.ComSpec。详见Shell的要求与Windows默认的Shell。- timeout
<number>
默认为 0。 - maxBuffer
<number>
stdout 或 stderr 允许的最大字节数。默认为 200*1024。如果超过限制,则子进程会被终止。详见 maxBuffer与Unicode。 - killSignal
<string> | <integer>
默认为 ‘SIGTERM’。 - uid
<number>
设置进程的用户标识,详见 setuid(2)。 - gid
<number>
设置进程的组标识,详见 setgid(2)。 - windowsHide
<boolean>
隐藏子进程的控制台窗口,常用于 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. _优点特性:
**1.
spawn
方法则是
实时返回
子进程的标准输出和标准错误流,适合执行
大量数据
或者
长时间运行
的命令[ 例如
npm run dev
];
2.
异步
执行的,可以在命令输出时即时处理数据,
不
会
阻塞
程序的执行;
3. 可以
灵活地配置
子进程的
输入输出
、
环境变量
等选项**
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``````<string>
子进程的当前工作目录。- env
<Object>
环境变量键值对。 - argv0
<string>
显式地设置要发给子进程的 argv[0] 的值。 如果未指定,则设为 command。 - stdio
<Array> | <string>
子进程的 stdio 配置。 (详见 options.stdio) - detached
<boolean>
准备将子进程独立于父进程运行。 具体行为取决于平台。(详见 [options.detached]) - uid
<number>
设置该进程的用户标识。(详见 setuid(2)) - gid
<number>
设置该进程的组标识。(详见 setgid(2)) shell``````<boolean> | <string>
如果为true
,则在一个 shell 中运行 command。 在UNIX
上使用'/bin/sh'
,在 -Windows
上使用process.env.ComSpec
。 一个不同的 shell 可以被指定为字符串。 See [Shell Requirements][] and [Default Windows Shell][]. 默认为 false(没有 shell)。- windowsVerbatimArguments
<boolean>
决定在Windows
系统下是否使用转义参数
。 在Linux平台下会自动忽略,当指令 shell 存在的时该属性将自动被设置为true。默认值: false。 - windowsHide 是否隐藏在
Windows
系统下默认会弹出的子进程控制台窗口。 默认为: false。
【4.1 】 .stdio 属性详解 :配制在父进程和子进程之间建立的管道
- 配制在父进程和子进程之间建立的管道
- 影响到
shell
命令,或者node
命令 在控制台上的输出
** 【属性值格式
<Array> | <string>
】**
- **
['pipe', 'pipe', 'pipe']
(默认值)**数组元素按位置
分别对应
: -stdin
[命令的标准输入] -stdout
[命令的标准输出] -stderr
[执行命令时出现的错误]
'pipe'
,'ignore'
,'inherit
值作用
父进程中通过pipe
等获取child_process.spawn.stdout.on(“data”, () => {})
父进程通过管道得到的是ignore
null
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
命令**
版权归原作者 Amber.Li 所有, 如有侵权,请联系我们删除。