js执行shell命令的几种方式(Node)
作者:溜溜的阿溜 发布时间:2024-04-16 10:35:14
在做一个客户端基建项目的时候,多处需要用到JS调取命令行执行shell脚本,这里对shell命令、JS执行shell命令做一个简单的介绍和总结。
前言
一般在纯前端静态页面的项目中,是不需要JS调命令行操作的,通常在Node项目,或者在Electron客户端项目中,可能会有这样的需求。(electron这个客户端框架本身就内置了node的很多方法)。因此下文针对的是有node层的项目如何执行shell。
先来了解一下shell是什么?
Linux/Unix中的shell,翻译是’壳’的意思;shell提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入操作系统的内核去执行。
1、命令行
用户直接在shell界面上执行shell命令,一行行书写,很少写出成套的程序来执行,所以称为命令行。
2、shell脚本
用户事先编写一个sh脚本文件,而后使用shell程序执行该脚本,这种方式,我们称shell编程。
调起shell的几种方式介绍(不限于这几种)
child_process:node的一个子进程api,可创建一个子进程用于执行命令行
shelljs: 基于node的api封装的一个shell执行插件
simple-git :基于node的ap封装的一个git命令执行插件
依次来了解一下吧
1、child_process
介绍
child_process是node提供的一个子进程AP,具体可见官网、中文网关于此类api的介绍,对衍生shell及参数有非常详细的说明,下面列出两个常用的api
1. child_process.exec(command[, options][, callback])
command:要运行的shell命令
创建一个新的shell进程,然后执行command
2. child_process.execFile(file[, args][, options][, callback])
file:要运行的文件名称或路径,参数作为数组传入
直接将可执行的file创建为新进程;需要单独写.sh文件,可编写复杂逻辑,但在windows上使用时会有兼容问题(此外,还有child_process.spawn()等可供选择)
示例
const util = require('util');
const child_process = require(‘child_process');
// 调用util.promisify方法,返回一个promise,如const { stdout, stderr } = await exec('rm -rf build')
const exec = util.promisify(child_process.exec);
const appPath = join(__dirname, 'app');
const runClean = async function () {
// cwd指定子进程的当前工作目录 这里的rm -rf build为删除指定目录下的一个文件夹
await exec(`rm -rf build`, { cwd: appPath });
await exec(`rm -rf test`, { cwd: appPath });
runClean();
2、shelljs
介绍
shelljs是j基于nodeAPI的一个扩展,要引入插件:(npm地址);它比原生的child_process的兼容性更好,使用更灵活,这个插件的使用率很高。
Tips:
这个插件不仅可以调用.exec执行shell命令,也封装了一些快捷操作指令,具体使用文档请参考github地址。
cat 返回文件内容
Const mdres = shell.cat(‘*.md')
pwd 获取当前目录
const res = shell.pwd();
find 查找文件
find(‘src', ‘lib');
find([‘src', ‘lib']); // same as above
find('.').filter(function(file) { return file.match(/.js$/); });
mkdir创建目录
mkdir('-p', ‘/tmp/a/b/c/d', ‘/tmp/e/f/g');
mkdir('-p', ['/tmp/a/b/c/d', ‘/tmp/e/f/g']); // same as above
示例
const shell = require(‘shelljs');
……
router.get('/update-git', function (req, res, next) {
// 如果目录存在,执行Git pull操作,否则新建目录,执行git clone 操作
if (fs.existsSync(`${root}/${groupName}/${name}`)) {
shell.exec('git pull', {
cwd: `${root}/${groupName}/${name}`,
});
} else {
shell.exec(`git clone ${remote} ${name}`, {
cwd: `${root}/${groupName}`,
});
}
……
});
3、simple-git
鉴于上个例子,执行shell脚本操作git,其实对于复杂的git命令语句,写起来还是很不方便,最后介绍一个专为git设计的插件:simple-git(npm地址)
介绍
在项目中引入插件后,调用simple-git/promise可执行异步git操作,方便结合async/await使用
它封装并支持了很多git的方法,比如clone、commit、status、pull等等,将cmd命令和参数,传入即可
甚至可以用git.raw(),解析前端输入的git命令
示例
以下为客户端项目通过ipc通信,处理git的请求
const simpleGit = require('simple-git/promise');
......
// 执行客户端模拟的 simple-git 函数
ipcMain.handle('simple-git', async function (e, { projectPath, cmd, args }) {
const git = simpleGit(projectPath);
try {
const res = await git[cmd](...args);
return res;
} catch (e) {
console.error('执行 simple-git 命令时发生错误', { projectPath, cmd, args }, e);
throw e;
}
});
shell是一种用户与内核进行交互操作的接口,我们通过执行shell命令行或者脚本可对本机文件、进程等进行操作。
js要执行shell命令,有很多方式,这里总结了几种基于node的方式:
child_process 原生nodeAPI,需根据需要选型
shelljs Node的一个扩展插件、兼容性好
simple-git:专为git命令打造的插件,轻量好用
来源:https://blog.csdn.net/cindy647/article/details/108830841


猜你喜欢
- 在实际应用中对于数据进行分析的时候,经常能看见缺失值,下面来介绍一下如何利用pandas来处理缺失值。常见的缺失值处理方式有,过滤、填充。一
- 若对于同一数据库实例中的两个数据库进行同步则直接对数据库表创建Trigger。SQL Server 2005的联机帮助:Trigger on
- 很多jsp程序员都遇到过这样的情况,jsp页面传递参数到servlet,只要参数有中文就是乱码,且大多数是??????乱码,尝试了网上比较普
- 3月27日,淘宝网获得了由国际权威机构G-CEM颁发的2008年度亚洲区在线客户体验大奖,这是全球互联网企业首次获得此殊荣。如何在让买家更方
- 总是记不住API。昨晚写的时候用到了这些,但是没记住,于是就索性整理一下吧:python中对文件、文件夹(文件操作函数)的操作需要涉及到os
- 前言Go语言做网络开发是非常容易的一件事,它已经为我们封装好了Http包,开箱即用。除此之外,我们也可以用Gin框架或者使用fasthttp
- 学习Django框架时,创建一个引擎及索引时报错,具体报错如下:执行命令:python3 manage.py rebuild_index报如
- 独立 fmt Log输出重定向golang的fmt包的输出函数 Println、Printf、PrintStack等,默认将打印输出到os.
- 本文实例讲述了Python实现针对中文排序的方法。分享给大家供大家参考,具体如下:Python比较字符串大小时,根据的是ord函数得到的编码
- 前言金融行业的Python学习,不同于IT系统开发,我们并不需要达到程序员的水平。然而,学会Python可以让你实现一个人写完一个交易系统的
- 本篇文章介绍如何使用xlrd来读取Excel表格中的内容,xlrd是第三方库,所以在使用前我们需要安装xlrd。另外我们一般会使用xlwt来
- 爬虫与反爬虫,这相爱相杀的一对,简直可以写出一部壮观的斗争史。而在大数据时代,数据就是金钱,很多企业都为自己的网站运用了反爬虫机制,防止网页
- 很多时候我们获取到一个列表后,这个列表并不满足我们的需求,我们需要的是一个有特殊顺序的列表.这时候就可以使用list.sort方法和内置函数
- 我就废话不多说了,大家还是直接看代码吧~#文件复制import ossrc_path=r'E:\Pycharm\python100题
- 在网络设备管理中,传输配置文件、镜像文件等是经常需要进行的操作。Netmiko是一个Python库,可用于与各种网络设备进行交互,提供了一些
- 1、现象系统提示找不到指定的文件:Error running 'hello': Cannot run program &qu
- 浏览器的简单操作# 导入webdriver模块# 创建driver对象,指定Chrome浏览器driver = webdrive
- 为什么要用el-scrollbar?最近在写一个内部平台系统,相信大家都知道,其中会有很多自定义的滚动区域,就比如说现在有一个列表需要滚动,
- 代码很简单,主要是修改了下百度分享的部分代码,小伙伴们自己对比下。<div class="tool_title"&
- 前言在尝试将结构体序列化为 Json 时,你可能会遇到 “omitempty” 标记,本小记就来浅看