it编程 > 前端脚本 > Node.js

nodejs脚本中如何执行shell命令

18人参与 2025-02-13 Node.js

官方文档:

node.js v8.x 中文文档:child_process - 子进程

node.js中使用内置的child_process模块来执行shell命令。该模块提供了exec、execfile、spawn等方法来启动子进程并执行命令

一:exec 方法执行shell命令

1. 注意:

第2点_举例:

npm run dev

该命令会一直运行,而 exec 方法的回调函数只有在命令运行完成后才会被调用,导致你的回调函数一直没有返回

2. 优点特性:

3. 语法格式

exec( '命令',option对象, 回调函数callback);

4. option对象属性

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:

二:spawn 方法 执行shell命令

1. 注意:

// 命令参数应该是一个`数组`  ['-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对象属性

【4.1 】 .stdio 属性详解 :配制在父进程和子进程之间建立的管道

【属性值格式 <array> | <string> 】

['pipe', 'pipe', 'pipe'] (默认值)

数组元素按位置分别对应:

'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]`);
});

示例中:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

Node.js项目依赖问题的详细解决步骤

02-13

Node.js中npm 和 peerDependencies的使用

02-13

Node.js与npm版本兼容性问题的原因及解决方案

02-13

Windows中彻底删除Node.js环境(以及npm)的方法

02-13

在Linux系统上升级Node.js遇到GLIBC依赖问题的多种解决方案

02-13

Windows部署NVM并下载多版本Node.js的方法(含删除原有Node的方法)

02-13

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论