Shell 相关概念介绍(bash, zsh,脚本, iTerm2...)

494 阅读3分钟

  • 广义Shell: 操作系统的壳, 它提供接口, 方便开发者去控制操作系统
  • 狭义Shell: Shell 解释器
    • 不同的操作系统默认不同的 Shell 解释器, 也可以安装第三方的
    • Linux/MacOS/Unix 默认 Shell 是 bash, 也可以安装 zsh
    • Windows 默认 shell 是 cmd, 后来跟随 bash 的脚步推出了更强大的 PowerShell
    • 也可以指定某种编程语言作为解释器: Node.js, Python, PHP....

1. Shell 脚本

Shell 脚本是由 Shell 命令组成的可执行文件, 可以通过解释器解释运行

Shell 脚本分为很多种, 由解释器决定的

Bash 是 Unix 系统和 Linux 系统的一种默认 Shell 解释器, 也是我们最常编写的一种 Shell 脚本。但作为前端开发来说编写 Bash 脚本需要单独学习 Bash 语法, 如果能使用我们最熟悉的 js 编写会节省很多学习成本。我们只需要指定脚本文件的解释器为 node 即可通过 Node.js 编写 Shell 脚本(也叫node命令行脚本)。

  • shell脚本文件后缀可省略, 但推荐写上, 可读性更高:

    • Bash: .sh
    • node: .js
    • cmd: .cmd .bat
  • 一个简单的 Bash 脚本("index.sh")

#!/bin/bash
mkdir app
cd ./app
touch index.js
ls

2. node 命令行脚本

一个简单的 node 命令行脚本

#!/usr/bin/env node
// => 第一行指定解释器

console.log('hello ', process.argv); // 打印命令行参数

// 执行 Unix 命令: 需要通过 child_process 模块
var exec = require('child_process').exec;
var child = exec('ls', function(err, stdout, stderr) {
  if (err) throw err;
  console.log(stdout);// 输出结果
});

#!/usr/bin/env node 可以不写吗?

  • 通过 node 执行指定脚本文件时("node ./index.js"), 可以不写
  • 执行该脚本时("./index.js"), 必须要写

为了简化功能实现, 通常会依赖一些第三方库

  • shelljs: 更方便的执行 Unix 命令, 它是基于 child_process 的封装
  • yargs: 方便操作配置命令行参数, 比 process.argv 更方便
  • ...

为什么要用 Unix 命令, 完全使用 Node.js 语法不可以吗?

  • 完全使用 Node.js 语法是可以的, 但是一些简单的任务直接使用 Unix 命令仍然是最方便的实现方案(如创建目录, 切换目录, 打印当前文件列表...)

3. Shell 终端工具

Shell 终端工具: 用来执行 shell 命令的软件, 提供了一些样式美化智能提示等功能

  • cmder: Windows下非常好用的终端模拟器, 支持不同 Shell 解释器(cmd, bash...)
  • iterm2: macOS 下最好用的终端工具, UI美观, 使用方便, 通常配合 zsh 使用
  • Windows Terminal: Windows新一代终端工具, UI更漂亮, 功能更强大
  • xshell: Windows端用来连接远程服务器的终端工具

4. 相关教程资料

5. 总结

Shell 是用来控制操作系统, Shell 脚本根据解释器不同可以分为很多种, 我们指定 bash 解释器及 bash 语法编写的叫做 Bash 脚本, 通过 node 解释器及 node 语法编写的叫做 node 命令行脚本

6. 后续

编写 node 命令行脚本也有诸多不方便的地方, 比如调用 Unix 命令, 下篇文章介绍一个 zx 库, 它可以让我们更高效的编写 node 脚本