作为程序员,在平时的开发中肯定少不了一些命令行操作了。当然,简单的命令大家都是可以拿捏的,但是涉及到一些逻辑的时候还是比较头疼的。

Shell

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。它既是一种命令语言,又是一种程序设计语言。

Shell 脚本(shell script),是一种为 shell 编写的脚本程序,一般文件后缀为 .sh

Shell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

Shell 的解释器种类众多,常见的有:

  • sh - 即 Bourne ShellshUnix 标准默认的 shell

  • bash - 即 Bourne Again ShellbashLinux 标准默认的 shell

  • fish - 智能和用户友好的命令行 shell

  • xiki - 使 shell 控制台更友好,更强大。

  • zsh - 功能强大的 shell 与脚本语言。

一般在 shell 脚本的开头,#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 解释器。#! 被称作 shebang

所以,你应该会在 shell 中,见到诸如以下的注释:

指定 sh 解释器

#!/bin/sh

指定 bash 解释器

#!/bin/bash

zx

当然,无论哪种解释器,对前端程序员都不算友好,有一定的学习成本。

毕竟我们只是 “切图仔”。

开个玩笑,因为我们前端程序员的口号是:能用 JS 实现的绝对不用其他语言实现。

当然,我们也可以用 Node.js 执行一些简单的 Shell 命令:

const { execSync } = require("child_process");exec('git diff orgin/master', (err, data) => {if (err) {console.log("失败", err);process.exit(1);} else {console.log("成功", data);}
});

但是这个体验和直接写 Shell 脚本相比就比较差了,我们需要手动用 child_process 进行包装、每次引入一些额外的依赖库、异常处理也比较麻烦、另外还要考虑转译命令行参数。

所以 Google 的前端程序员开源了基于 JavaScript 实现的 Shell 解释器。zxchild_process 进行了默认包装,对参数进行了转译而且提供了合理的默认值。可以很方便的让我们使用前端熟悉的 JavaScript 语法来编写 Shell 脚本:

#!/usr/bin/env zxawait $`cat package.json | grep name`let branch = await $`git branch --show-current`
await $`dep deploy --branch=${branch}`await Promise.all([$`sleep 1; echo 1`,$`sleep 2; echo 2`,$`sleep 3; echo 3`,
])let name = 'foo bar'
await $`mkdir /tmp/${name}`

使用

安装(要求 Node.js 版本 >= 16.0.0):

npm i -g zx

建议将脚本写到 .mjs 的文件里,这样我们可以很方便的直接在顶层使用 await,然后在文件开头声明下面的 shebang

#!/usr/bin/env zx

通过下面的方式运行脚本:

chmod +x ./script.mjs
./script.mjs

或者使用 zx 运行:

zx ./script.mjs

可以尝试一下:

const list = await $`ls -a`;console.log(list);const name = await question('你的名字是啥? ')console.log(`你的名字是:${name}`);

所有函数($、cd、fetch等)都可以直接使用,无需任何导入。

它还内置了很多方便的处理函数:

  • $command:使用 child_processspawn 来制定指定的命令,返回一个 Promise

  • cd():进入其他目录。(cd('/project')

  • fetch():发起方洛请求

  • question():读取用户输入,相当于 readline 的封装

  • sleep():等待一段时间,相当于 setTimeout 的封装

  • echo():大打印文本,也可以直接用 console.log

更多使用可以参考官方文档:https://github.com/google/zx

使用 JavaScript 编写 Shell 脚本相关推荐

  1. 如何使用zx编写shell脚本

    编写Shell脚本的问题 创建一个由Bash或者zsh执行的shell脚本,是自动化重复任务的好方法.Node.js似乎是编写shell脚本的理想选择,因为它为我们提供了许多核心模块,并允许我们导入任 ...

  2. 用 JavaScript 编写测试脚本

    用 JavaScript 编写测试脚本 Truffle使用 Mocha 测试框架和 Chai 断言,为编写 JavaScript 测试提供了坚实的框架. 让我们深入研究,看看 Truffle 是如何建 ...

  3. linux 脚本 lang,golang可以编写shell脚本吗

    golang可以编写shell脚本吗 golang是可以编写shell脚本,首先可以通过创建一个阅读器去访问键盘,每当按下回车键时,任何的写入都会被存储到输入变量中:然后根据出入的数据来执行逻辑运算: ...

  4. 深信服上网行为管理开启snmp_编写SHELL脚本在CACTI中来实现监控深信服上网行为管理的CPU和内存使用情况...

    一.深信服上网行为管理中的SNMP设置 二.在CACTI中编写SHELL脚本如下: cpu oid: .1.3.6.1.4.1.35047.1.3 内存 oid: .1.3.6.1.4.1.35047 ...

  5. linux 脚本监听,Linux—编写shell脚本监控主机

    编写SHELL脚本监控主机 1.用vi命令在/root目录是新建一个脚本文件sysmon.sh: 内容如下: #!/bin/bash dug=$(df -h | grep "/$" ...

  6. Linux中shell编程——编写shell脚本,实现功能:在用户输入年、月后自动打印出对应年月的日

    实验目的 理解shell程序的设计方法 掌握shell程序编辑.运行.调试方法与过程 实验内容 shell简单编程 实验过程 要求: 1.记录实验过程,对关键过程进行文字说明并附上操作截屏. 2.逻辑 ...

  7. 【Linux学习】如何编写Shell脚本调用企业微信api来发消息给企业微信成员?

    一.前言 最近通过python实现了发送消息给企业微信的功能,参考链接: [Jenkins学习 ]如何编写Python脚本来调用企业微信的api通知企业微信成员关于Jenkins的编译结果? http ...

  8. 9.4 Scratch3/www,踩坑,修改chroblocks模块LED输入方式,第五天:修改模块并同步一键云部署(软连接制作,密钥生成,编写shell脚本实现发布,与git pull 分支更新)。

    1.git clone 官网的scratch3.0/www 问题1: python2模块. 方案:需安装到c://Python27下 问题2: 先安装Cocos2d-x模块. https://coco ...

  9. 编写shell脚本,要求输入一个数字,然后计算出从1到输入数字的和,要求,如果输入的数字小于1,则重新输入,直到输入正确的数字为止;

    编写shell脚本,要求输入一个数字,然后计算出从1到输入数字的和,要求,如果输入的数字小于1,则重新输入,直到输入正确的数字为止: #! /bin/bash n=0 while [ $n -lt & ...

最新文章

  1. Javascript 控制 Flash FLV视频播放器 --国外开源
  2. $.messager.progress ajax,ajax异步上传文件返回undefined
  3. python小游戏源码-python21点小游戏源码免费下载
  4. 【OpenCV3】角点检测——cv::goodFeaturesToTrack()与cv::cornerSubPix()详解
  5. C++ Primer 5th笔记(chap 16 模板和泛型编程)包扩展
  6. 选择排序算法,只需这篇文章就够了
  7. 【译】node js event loop part 1.1
  8. 学习使用markdown(markdown篇)
  9. 关于_WIN32_WINNT的含义
  10. spring 调用python_Spring http服务远程调用实现过程解析
  11. Hibernate 事物隔离级别 深入探究
  12. 信息学奥赛一本通 1024:保留3位小数的浮点数 | OpenJudge NOI 1.1 04
  13. python 三维数组_NumPy处理图像不香吗?我用Python把秋日里最美的景色做成了这种效果~...
  14. mysql5.0优势_mysql5.0.1提供视图功能其优势
  15. 想知道账号被封的感觉么?
  16. DOM节点的属性和方法
  17. 知了课堂小程序es6
  18. 计算机视觉硕士课程南京大学,南京大学计算机系研究生课程文库
  19. 【模式识别】信号检测实验及MATLAB仿真
  20. deecamp考试题

热门文章

  1. 在DW中制作网页中的表格
  2. wxPython 2 - wxPython基础
  3. ffmpeg使用filter生成H264测试视频(带时间戳OSD)
  4. Bootloader的启动与功能
  5. [AHK]为通达信软件定义快捷键(发送按键法)
  6. 数据库常见问题:服务器'SQL SERVER'上的 MSDTC 不可用
  7. 浅析敏捷项目管理中的5大阶段
  8. 【Windows 问题系列第 2 篇】如何让显示的窗口在桌面的最上面,而不被其它窗口遮挡?
  9. java ee中ssh学后感_学习SSH,SSM框架有感
  10. 【烧写Uboot到SD卡,打开 SD-bl1-8k.bin 失败,failed to open‘SD-bl1-8k.bin】