Shell基础概念
概念
终端
获取用户输入、展示运算结果的硬件设备
终端模拟器
Mac Terminal、iTerm2等,关联虚拟tty的输入输出软件
tty
teletypeWriter的简称,和终端等价,早期指电传打印机,在Linux中式输入/输出环境
Shell
command interpreter,处理来自终端模拟器的输入,解释执行之后输出结果给终端
Bash
Shell的一种具体实现
发展
- Ken Thompson(来自贝尔实验室)在1971年为UNIX 开发了第一个 shell,称为 V6 shell
- Stephen Bourne 在贝尔实验室 为V7 UNIX 所开发的 Bourne shell,即 sh
- 开源组织 GNU为了取代 Bourne shell 开发的 Bourne-Again shell,即 Bash
构成
A Unix shell is both a command interpreter and a programming language. As a command interpreter, the shell provides the user interface to the rich set of GNU utilities.
命令和语法
变量
| 类型 | 作用域 | 声明方式 | 规范 |
|---|---|---|---|
| 自定义变量 | 当前Shell | = | 字符串、整型、浮点型、日期型 |
| 环境变量 | 当前Shell及其子Shell | export、declare -x | |
| 系统环境变量 | 所有Shell | 启动加载 |
父子Shell
系统环境变量
| 变量名 | 含义 | 常见操作 |
|---|---|---|
| $0 | 当前Shell名称/脚本名称 | 2等可以获取到传入参数 |
| $# | 传入脚本的参数数量 | if [ $# -gt 1 ] |
| $* | 传入脚本的所有参数 | |
| $? | 上条命令执行的状态码 | if [ $? -eq 0 ] |
| $PS1 | 命令提示符 | export PS1="\u@\h \w>?" |
| $HOME | 用户主文件夹 | cd ~ |
| $PATH | 全局命令的搜索路径 | PATH=$PATH:[新增路径] |
配置文件加载
管道
管道与管道符|,作用是将前一个命令的结果传递给后面的命令
语法:cmd1|cmd2
要求:管道右侧的命令必须能接受标准输入才行,比如grep命令,Is、mv等不能直接使用,可以使用xargs预处理
注意:管道命令仅仅处理stdout,对于stderr会予以忽略,可以使用 set-o pipefail 设置 shell 遇到管道错误退出
#!/bin/bash
cat platform.access.log | grep ERROR
netstat -an | grep ESTABLISHED | wc -l
find . -maxdepth 1 -name "*.sh" | xargs 1s -l
执行过程和原理
- 字符解析
- 识别换行符、 分号(;)做行的分割
- 识别命令连接符(|| && 管道)做命令的分割
- 识别空格、tab符,做命令和参数的分割
-
shell 展开, 例如 {1..3} 解析为 1 2 3
-
重定向, 将stdin、stdout、 stderr的文件描述符进行指向变更
-
执行命令
builtin 直接执行
非 builtin 使用SPATH查找,然后启动子进程执行
- 收集状态并返回
调试和前端集成
VSCode配置
-
shellman: 代码提示和自动补全
-
shellcheck: 代码语法校验
-
shell—format: 代码格式化
-
Bash Debug: 支持单步调试
- 安装 vscode 插件
- 编写 launch. json文件
- 升级bash到4.x以上版本
前端集成
- node中通过exec、spawn调用shell命令
- shell脚本中调用node命令
- 借助zx等库进行javascript、shellscript的融合
- 借助shell完成系统操作、文件IO、内存、磁盘系统状态查询等
- 借助node.js完成应用层能力、网络IO、计算等