shell的概念
shell是介于用户和内核之间的桥梁,用户输入命令--->shell翻译指令---->调用内核执行----->返回结果
cat /etc/shells 可查看已安装的各种shell
例子
ls -l
执行流程
- 解析命令:ls是命令 -l参数
- 查找程序:在#PATH中搜索 /bin/ls
- 调用内核:内核执行
- 输出结果:显示文件列表
shell常用类型
- bash ---大多数linux发行版的默认交互shell, 和dash比,交互功能更加强大
- dash --- 轻量级,速度更快,内存占用更小,更适合脚本启动
shell的层级关系
每个shell都是一个进程, 创建的子shell也都是一个进程,只不过子shell的ppid一般是上一级shell的pid
创建子shell
- 进入虚拟终端后会启动默认的交互式shell,也就是父shell
- 再次输入bash,会依赖父shell创建一个子shell
- 再次输入dash,会依赖上一级bash再创建一个子shell
- ps --forest查看进程树或者ps -l 查看ppid和pid来观察依赖关系
退出子shell
- 执行exit命令,退出PID等于48990的子shell
- 继续执行exit命令, 退出PID等于48989的子shell
- 再继续执行exit命令,退出系统默认的交互shell, 直接退出虚拟终端
shell的内建命令
内建命令不需要创建子进程来执行,内建命令和shell编成一体,不需要依赖外部执行
常见内部命令
shell执行的外部命令
存在于bash shell之外的程序,并不属于shell程序,一般位于/bin; /usr/bin; /sbin; /usr/bin
每次执行外部命令会创建一个子进程,被称为衍生,开销较高
常见外部命令
可以通过type查看是内建命令还是外部命令
命令详情
which命令 --- 返回文件的路径名称或者环境
alias命令 ----别名
alias [-p] [name[=value] ...]
别名只在当前shell生效, 可以看下图, 别名li在子bash里会报comman not found, exit退出后则可以正常执行
hitsory命令 ---- 显示历史命令列表, 默认展示近1000多条历史命令, 历史命令存储在/home/用户名/.bash_history隐藏文件中
history [-c] [-d offset] [n] or history
- -c : 清除历史命令,但不会立刻从/.bash_history中删除, 如下图
- -a : 立刻将当前会话的历史命令追加到历史文件中
- -w: 将当前命令写入历史文件中
- n: 显示最近n条命令
- !! : 显示上一条命令
- !n: n为历史命令编号
; --- 单行同时执行多个命令可以使用;进行分割
() --- 执行命令时加()会创建一个子shell来执行, 且()
- 创建独立的执行环境
- 变量修改不影响父shell
- 命令结束后自动销毁
&---- 命令后带&, 表示进入后台模式 , 创建子进程执行命令
jobs命令 ---- 展示作业状态
- -l : 显示详细信息
- -n: 显示从最后一次到现在改变的作业
- -s: 显示已停止的作业
- -r: 显示允许中的作业
- -p: 仅显示进程id
作业状态枚举
- running: 允许中
- suspended: 已暂停
- done: 已完成
- terminated: 被终止
sleep命令 -- 休眠命令
sleep numbers 默认是秒
echo命令 --- 展示文本行
- -n : 不输出行尾换行符
- -e: 启用转义字符解析
- -E: 禁用转义字符
coproc命令 --- 创建子协程
注解:参考linux命令与shell脚本编程大全(第4版)