一、什么是Shell & 系统有哪些Shell
1. 查看自己默认用的Shell
我们登录Linux终端时自动运行的shell,写在 /etc/passwd 文件里,第7段就是默认shell。
# 查看自己用户的配置
cat /etc/passwd | grep 你的用户名
示例输出:
zhangzy:x:1165:1165:,,,:/home/zhangzy:/bin/bash
末尾 /bin/bash 代表我默认使用bash。
2. Linux里常见的Shell
系统所有shell程序都放在 /bin 文件夹,执行这条命令查看全部:
ls -lF /bin/*sh
常用shell简单介绍:
1. bash:最常用,我们上课全程用这个
2. dash:轻量小shell,系统开机脚本用它
3. zsh、csh:拓展功能更强的shell,可选使用
4. sh:不是独立程序,是dash的快捷链接
3. 切换不同shell
想临时体验dash,直接输入程序名;想退出回到原来窗口输入exit:
/bin/dash # 进入dash
exit # 退出dash,返回bash
二、父Shell和子Shell(本节课重点)
1. 基础概念
父Shell:打开终端、登录系统自动弹出的第一个bash窗口,最顶层shell。
子Shell:在父shell里输入bash、用括号包命令、后台运行程序时,系统新建的一层shell。
2. 实操:创建多层子shell
bash # 创建第1层子shell
bash # 创建第2层子shell
ps --forest # 查看进程树,能看到层层嵌套的bash
exit # 退出一层子shell,回到上一层
每输一次bash就多一层子shell,exit一层一层往上退。
3. 怎么判断当前是不是子shell
系统自带变量 $BASH_SUBSHELL:
输出0 = 当前是父shell
输出1/2 = 处于1层/2层子shell
对比两种命令写法
1. 分号 ; 执行(不产生子shell)
pwd; ls; echo $BASH_SUBSHELL
# 结果输出0,所有命令在父shell运行,cd会改变当前文件夹
2. 括号 () 执行(生成子shell)
(pwd; ls; echo $BASH_SUBSHELL)
# 结果输出1,cd只会在括号内生效,不会影响外面终端
4. 后台运行命令 & jobs管理
命令末尾加 &,程序放到后台跑,不卡住终端:
sleep 60 & # 后台休眠60秒
jobs # 查看所有后台任务
jobs -l # 查看后台任务+进程编号
5. 协程 coproc(拓展内容)
coproc 会自动在后台开一个子shell运行程序,语法有严格要求:
1. { 前后必须有空格
2. 最后一条命令末尾加分号 ;
3. ; 和 } 中间留空格
# 默认名字协程
coproc sleep 10
# 自定义协程名称
coproc MyJob { sleep 10; }
jobs -l # 查看协程任务
三、两种命令:内建命令 和 外部命令
1. 外部命令
是独立存在的文件,存放在 /bin、/usr/bin,运行时会新建子进程,速度慢。
比如ps、ls都属于外部命令。
which ps # 查看命令文件位置
type -a ps
2. 内建命令
直接集成在bash内部,没有单独文件,运行不需要新建子进程,速度更快。
cd、exit、history、alias都是内置命令。
type cd # 输出 cd is a shell builtin
type exit
3. 特殊命令:既有内置、又有外部文件
echo、pwd 同时有两种版本:
type -a echo
# 输出两行:
# echo is a shell builtin(内置)
# echo is /bin/echo(外部文件)
which echo # 只显示外部文件路径