js执行shell命令的几种方式(Node)

2023-11-20

在做一个客户端基建项目的时候,多处需要用到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的几种方式介绍(不限于这几种)

  1. child_process:node的一个子进程api,可创建一个子进程用于执行命令行
  2. shelljs: 基于node的api封装的一个shell执行插件
  3. 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地址

  1. cat 返回文件内容
    Const mdres = shell.cat(‘*.md’)

  2. pwd 获取当前目录
    const res = shell.pwd();

  3. find 查找文件
    find(‘src’, ‘lib’);
    find([‘src’, ‘lib’]); // same as above
    find(’.’).filter(function(file) { return file.match(/.js$/); });

  4. 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地址)

介绍

  1. 在项目中引入插件后,调用simple-git/promise可执行异步git操作,方便结合async/await使用
  2. 它封装并支持了很多git的方法,比如clone、commit、status、pull等等,将cmd命令和参数,传入即可
  3. 甚至可以用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的概念及三种js执行shell命令的方式(这里只列出了简单的命令,实际也可以根据需要编写.sh文件,传参相对路径,执行更复杂的shell脚本);总的来说,有以下几点:

  1. shell是一种用户与内核进行交互操作的接口,我们通过执行shell命令行或者脚本可对本机文件、进程等进行操作。
  2. js要执行shell命令,有很多方式,这里总结了几种基于node的方式:
    1. child_process 原生nodeAPI,需根据需要选型
    2. shelljs Node的一个扩展插件、兼容性好
    3. simple-git
      专为git命令打造的插件,轻量好用
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js执行shell命令的几种方式(Node) 的相关文章

随机推荐

  • QT的QListWidget之单击双击增删改详解

    QListWidget是列表框控件 它是通过QListWidgetItem列表项来进行操作 我们的增删改操作也是围绕着它来开展 需要注意的是 删除操作 需要先断开QListWidget的信号和槽连接 否则会程序崩溃 void MainWin
  • opencv畸变校正的两种方法

    opencv中畸变校正有两种方法 1 undistort 直接进行畸变校正 void cv undistort InputArray src 原始图像 OutputArray dst 矫正图像 InputArray cameraMatrix
  • echarts中的地图展示所有省份以及悬浮上去展示具体的信息

  • stm32 HAL库 Flash操作简介

    stm32 HAL库 Flash操作简介 目录 第一stm32 flash介绍 查看代码段 以判断代码长度 flash的基本操作规则 stm32 HAL库 Flash操作指南 stm32f1xx hal flash c stm32f1xx
  • 在家做什么手工赚钱,这5种比较适合在家操作!

    对于很多怀孕的女生来说 呆在家里确实很无聊 大部分人呆在家里只能看看电视 玩玩手机 很多的孕妈都会抱怨 真是无聊透了 所以对于很多的孕妈来说 都想找点事做来缓解自己无聊的情绪 避免得了抑郁症 给宝宝带来不好的环境 那么怀孕在家里 有什么轻松
  • SpringSecurity的使用和流程详解(二)

    文章目录 登录 准备工作 核心代码 校验 准备工作 核心代码 测试 退出登录 登录 准备工作 添加依赖
  • 线程池代码

    线程池 Global h pragma once const int DEFAULT POOL SIZE 10 const int STARTED 0 const int STOPPED 1 Mutex h pragma once incl
  • 鸡肋的RDP反制

    更新时间 2023年07月19日09 18 29 为什么叫鸡肋 鸡肋者 食之无肉 弃之有味 你说不能成吧 但是有成功案例 你说成了吧 要求太高 还要看运气的 一句话 对方需要开启磁盘共享 不开启 没办法反制 1 背景介绍 在很多攻防中 蓝队
  • 向量叉乘判断顺时针还是逆时针

    可以通过向量的叉乘判断一条线旋转的过程是顺时针还是逆时针的 有两个向量AB和AC 将两个向量进行叉乘 direct AB x AC 当direct gt 0时 为逆时针旋转 当direct lt 0时为顺时针旋转 当写类似于旋转按钮的控件的
  • 螺纹检测案例-螺距测量-大径小径检测-螺牙检测

    齿轮检测分析 Gear inspection and analysis 螺纹结构及检测要素 1 大径 宽径 2 小径 窄径 3 中经 4 螺距 间距 5 螺牙高度 深度 VisionBank 软件螺纹检测工具 02 01 螺纹检测分析流程
  • 高性能MySQL实战(二):索引

    我们在上篇 高性能MySQL实战 一 表结构 中已经建立好了表结构 这篇我们则是针对已有的表结构和搜索条件为表创建索引 1 根据搜索条件创建索引 我们还是先将表结构的初始化 SQL 拿过来 CREATE TABLE service log
  • 野火STM32F103教学视频完整目录(配合霸道-指南者开发板)

    野火STM32F103教学视频 P1 入门篇 2 如何安装KEIL5 flv 野火STM32F103教学视频 P2 入门篇 3 如何使用DAP仿真器下载程序 flv 野火STM32F103教学视频 P3 入门篇 4 串口ISP一键下载原理分
  • tmux使用方法

    tmux使用指南 比screen好用n倍 知乎 当你开启一个session的时候会默认开启一个window 这个截图就是一个window 而这个window可以拆成很多分subwindow 在这里就是 左上角Asubwindow 左下角Bs
  • 微信小程序优化多次跳转后卡顿问题

    一 微信小程序多次跳转会产生卡顿的原理 通过wx navigateTo 跳转 都会出现保留当前页面 打开新的页面机制 wx navigateTo不会将旧页面出栈 会将新页面入栈 栈内元素个数增加 栈内元素5个时 不能再跳转 手机性能好点 可
  • fastjson的JSONObject.toJSONString方法失效问题

    String toJSONString Object object 问题 该方法序列化的object对象 需要Object类中包含属性的get方法 如果没有get方法 则会序列化出一个空数组 解决 增加 Data注解 或 添加成员变量的ge
  • DOM编程2-重要案例!!!

    2 操作表格 2 1表格对象的属性和方法 2 2表格行对象的属性和方法 2 3表格单元格对象的属性和方法 3 案例演示 3 1表格案例 3 1 1修改标题样式 3 1 2在表格末尾追新增一行 3 1 3删除第二行 3 1 4复制最后一行 订
  • Docker命令指南

    文章目录 前言 一 基础命令 前言 记录一些基本的Docker命令 一 基础命令 docker version docker的详细信息 docker info docker的系统信息 docker help docker帮助手册 docke
  • CodeBlocks+wxWidgets

    之前也安装过CodeBlocks 只是当时没有安装wxWidgets 试着新建一个wxWidgets工程后没有看到界面设计的东东就放弃了 今天发现群里的南果梨也在用CodeBlocks 在他的帮助也终于成功的安装了wxWidgets 到ww
  • 008-黑盒测试和白盒测试的优缺点

    黑盒测试和白盒测试的优缺点 黑盒测试的优点有 比较简单 不需要了解程序内部的代码及实现 与软件的内部实现无关 从用户角度出发 能很容易的知道用户会用到哪些功能 会遇到哪些问题 基于软件开发文档 所以也能知道软件实现了文档中的哪些功能 在做软
  • js执行shell命令的几种方式(Node)

    在做一个客户端基建项目的时候 多处需要用到JS调取命令行执行shell脚本 这里对shell命令 JS执行shell命令做一个简单的介绍和总结 前言 一般在纯前端静态页面的项目中 是不需要JS调命令行操作的 通常在Node项目 或者在Ele