Shell、终端与命令行基础知识总结
阅读指南
- 完全新手 → 从【一】开始按顺序看,重点是【一】【二】【三】
- 想速查 → 直接跳【三、各平台对照表】或【七、跨平台兼容性】
- 写脚本前 → 看【六、.sh 脚本运行方式】和【七、跨平台兼容性】
一、三个最容易混淆的词(小白必读)
想象你在跟电脑”打字聊天”,整个过程其实分三层:
| 层 | 名字 | 是什么 | 类比 |
|---|---|---|---|
| 第一层 | 终端 (Terminal) | 那个黑乎乎的窗口本身(一个 App) | 微信的聊天界面 |
| 第二层 | Shell | 在窗口里听懂命令、执行、回复的程序 | 跟你聊天的那个”客服 AI” |
| 第三层 | 命令行 (Command Line) | 你和它用打字这种交互方式 | 你们是”文字聊天”而不是”语音通话” |
关键认知:终端和 Shell 是两个独立的东西! 终端只管”显示窗口”,Shell 才是”真正干活”的。 就像浏览器(窗口)和你登的账号(Shell)是分开的——可以换账号,但浏览器还是那个浏览器。
二、Shell 家族关系图(隶属/层级结构)
Shell 是一个统称,下面有很多”品牌”,分两大家族:
Shell(命令解释器,统称)
│
├── Unix 家族(Mac / Linux 用的,语法基本通用)
│ ├── sh —— 最老的祖宗(1977 年),兼容性最好
│ ├── bash —— sh 的进化版,Linux 默认 ★
│ ├── zsh —— 比 bash 更好用,Mac 默认 ★
│ └── fish —— 新派,语法漂亮但不兼容 bash
│
└── Windows 家族(语法和 Unix 完全不一样)
├── cmd.exe —— 老式黑窗口,DOS 时代留下来的(1987)
├── PowerShell —— 微软新一代,功能强大 ★
└── WSL(外挂) —— Windows 里装的"Linux 子系统",能跑 bash/zsh
★ = 当前各系统默认/主推的。
三、各平台终端与 Shell 对应关系(速查)
| 平台 | 终端应用(窗口) | 默认 Shell | 脚本后缀 |
|---|---|---|---|
| macOS | Terminal.app(自带) / iTerm2(第三方) | zsh(2019 起) | .sh |
| Linux | GNOME Terminal / Konsole 等 | bash | .sh |
| Windows | Windows Terminal(新)/ CMD 窗口(老) | cmd.exe 或 PowerShell | .bat / .cmd / .ps1 |
| Windows + WSL | WSL 终端 | bash(Linux 子系统) | .sh |
一句话总结:Mac → zsh,Linux → bash,Windows → PowerShell。
四、常见 Shell 类型详解
| Shell | 出生年代 | 说明 |
|---|---|---|
| sh | 1977 | 最古老的 Shell,兼容性最好,是 bash/zsh 的祖宗 |
| bash | 1989 | Linux 默认 Shell,最通用,全名 “Bourne-Again SHell” |
| zsh | 1990 | macOS 默认(2019 起替代 bash),功能更丰富,插件生态强 |
| fish | 2005 | 新一代 Shell,语法友好但不兼容 bash |
| cmd.exe | 1987 | Windows 老式命令行,DOS 时代遗留 |
| PowerShell | 2006 | 微软新一代,面向对象,功能强大,可跨平台 |
bash 和 zsh 日常使用差别很小,95% 的命令完全相同。学一个就够。
五、新手常见疑问 FAQ
Q1:终端 ≠ Shell?我打开 Mac 的”终端”,跑的是啥?
- 打开的是 Terminal.app(终端窗口)
- 窗口里默认在跑 zsh(Shell)
- 你也可以在同一个窗口里敲
bash切换到 bash - 终端是”窗口”,Shell 是”窗口里跑的程序”,两者解耦
Q2:bash 和 zsh 我该学哪个?
- Mac 上默认就是 zsh,不用换
- 95% 的日常命令两者完全一样(cd、ls、grep 都通用)
- 学一个就够了,遇到差异再查
Q3:cmd 和 PowerShell 啥区别?
- cmd = 1980 年代 DOS 留下来的老古董,功能弱
- PowerShell = 微软 2006 年新做的,面向对象、功能强大
- 新教程、新脚本都用 PowerShell
Q4:为什么 .sh 脚本在 Windows 上跑不了?
.sh是写给 bash/zsh 看的”剧本”- Windows 默认没装 bash/zsh,看不懂
- 解决:装 WSL(微软官方)或 Git Bash(装 Git 时附带)
Q5:“命令行”和”终端”是一回事吗?
- 不是。“命令行”是交互方式(打字输命令),“终端”是承载这种方式的窗口
- 日常口语中很多人混着用,听懂意思即可
Q6:怎么查我现在用的是哪个 Shell?
echo $SHELL # 查看默认 Shell
echo $0 # 查看当前正在用的 Shell六、.sh 脚本的运行方式
# 方式一:指定 Shell 执行
bash script.sh
zsh script.sh
# 方式二:加权限后直接运行
chmod +x script.sh # 加执行权限(只需一次)
./script.sh # 直接运行七、跨平台脚本兼容性
默认不能互相运行,因为语法完全不同。
| 脚本 \ 环境 | bash/zsh | CMD | PowerShell | WSL |
|---|---|---|---|---|
.sh | ✅ | ❌ | ❌ | ✅ |
.bat / .cmd | ❌ | ✅ | ✅ | ❌ |
.ps1 | ❌ | ❌ | ✅ | ❌ |
特殊情况:PowerShell 能跑 .bat(自动调用底层 cmd.exe),但反过来不行。
曲线救国方案
| 需求 | 方法 |
|---|---|
Windows 上跑 .sh | 安装 WSL 或 Git Bash |
Linux/Mac 上跑 .ps1 | 安装 PowerShell Core(跨平台版) |
Linux/Mac 上跑 .bat | 基本无解 |
真正的跨平台方案
用 Python(.py)或 Node.js(.js)写脚本,装了对应运行时哪里都能跑。
八、一张图记住所有关系(终极总结)
你(用户)
│ 敲键盘
▼
┌─────────────────────────────────────┐
│ 终端 (Terminal.app / iTerm2 / ...) │ ← 窗口:负责显示 + 收键盘
│ ┌───────────────────────────────┐ │
│ │ Shell (zsh / bash / ...) │ │ ← 解释器:理解 + 执行命令
│ │ ↓ 翻译命令为系统调用 │ │
│ │ 操作系统内核 (Kernel) │ │ ← 最底层:真正操作硬件
│ └───────────────────────────────┘ │
└─────────────────────────────────────┘
数据流:键盘输入 → 终端显示 → Shell 解析 → 内核执行 → 结果返回 Shell → 终端显示
九、ls -l 输出与文件权限详解
ls -l 是最常用的查看文件命令,但输出格式让人头大。这里彻底拆解。
9.1 一行 ls -l 长这样
$ ls -l 文件名.pdf
-rw-r--r--@ 1 <your-username> staff 398451 3月 11 15:54 文件名.pdf-rw-r--r--@ 1 <your-username> staff 398451 3月 11 15:54 文件名.pdf
① ② ③ ④ ⑤ ⑥ ⑦
| 段 | 内容 | 含义 |
|---|---|---|
| ① | -rw-r--r--@ | 文件类型 + 权限 + 扩展属性 |
| ② | 1 | 硬链接数(几乎总是 1,不用管) |
| ③ | <your-username> | 所有者(用户名) |
| ④ | staff | 所属用户组(macOS 默认普通组) |
| ⑤ | 398451 | 文件大小(字节数,约 389 KB) |
| ⑥ | 3月 11 15:54 | 最后修改时间 |
| ⑦ | 文件名.pdf | 文件名 |
9.2 第①段拆解:权限位 11 个字符
最关键的就是这 11 位,要拆成 4 段看:
- rw- r-- r-- @
①.1 ①.2 ①.3 ①.4 ①.5
文件 所有者 用户组 其他人 扩展属性
类型 权限 权限 权限 标记
第 1 位:文件类型
| 字符 | 含义 |
|---|---|
- | 普通文件 |
d | 目录(directory) |
l | 软链接(link,类似快捷方式) |
c / b | 字符/块设备(系统底层用) |
第 2-10 位:三组权限(每组 3 位)
每组 3 位代表 读 / 写 / 执行 权限:
| 位置 | 字符 | 含义 |
|---|---|---|
| 第 1 位 | r 或 - | read(读取) |
| 第 2 位 | w 或 - | write(写入/修改) |
| 第 3 位 | x 或 - | xecute(执行) |
- 表示没这个权限。三组从左到右分别代表:
- 所有者权限:文件主人能干啥
- 用户组权限:同组成员能干啥
- 其他人权限:其他用户能干啥
例子:-rw-r--r--
rw-所有者:读 ✅ 写 ✅ 执行 ❌r--用户组:读 ✅ 写 ❌ 执行 ❌r--其他人:读 ✅ 写 ❌ 执行 ❌
PDF 不是脚本/程序,所以没有
x(执行)权限,正常。
第 11 位:扩展属性标记
| 末尾标记 | 含义 |
|---|---|
| 无 | 普通文件,无特殊标记 |
@ | 有扩展属性(macOS 特有:下载来源、Finder 标签等) |
+ | 有 ACL(访问控制列表,更复杂的权限规则) |
macOS 扩展属性常见操作:
xattr 文件名 # 列出有哪些扩展属性
xattr -l 文件名 # 详细列出(含值)
xattr -c 文件名 # 清除所有扩展属性用得最多的场景:从网上下载的 App 被 Gatekeeper 拦截,用
xattr -c清除隔离属性即可解锁。
9.3 数字权限 vs 字母权限
权限有两种写法,等价:
| 字母 | 数字 | 含义 |
|---|---|---|
r | 4 | 读 |
w | 2 | 写 |
x | 1 | 执行 |
- | 0 | 无 |
三组权限相加变成 3 位数字:
| 字母权限 | 计算 | 数字权限 |
|---|---|---|
rwx | 4+2+1=7 | 7 |
rw- | 4+2+0=6 | 6 |
r-x | 4+0+1=5 | 5 |
r-- | 4+0+0=4 | 4 |
--- | 0 | 0 |
常见组合:
| 数字 | 字母 | 适用场景 |
|---|---|---|
644 | rw-r--r-- | 普通文件(默认) |
755 | rwxr-xr-x | 可执行脚本、目录 |
600 | rw------- | 私密文件(如 SSH 密钥) |
777 | rwxrwxrwx | 完全开放(很危险,不要用) |
改权限命令:
chmod 644 文件名 # 数字方式
chmod u+x 文件名 # 字母方式:给 user(所有者)加执行权限
chmod g-w 文件名 # 给 group(组)去掉写权限
chmod a+r 文件名 # all(所有人)加读权限
chmod -R 755 目录名 # 递归改目录下所有文件权限9.4 时间字段:mtime 不是创建时间
Linux/Mac 文件其实有 3 种时间:
| 缩写 | 含义 |
|---|---|
| mtime | 内容最后修改时间(ls -l 默认显示) |
| atime | 最后访问/读取时间 |
| ctime | 元数据最后变化时间(如改权限) |
⚠️ 传统 Unix 没有”创建时间” 概念。macOS 例外(APFS 有 birthtime),用
stat 文件名才能看到完整时间信息。
9.5 一句话小白总结
看到
-rw-r--r--@就读成:普通文件 / 我能读写 / 别人只能读 / 带 macOS 特殊标签。
十、常用命令大全(小白必看)
按使用场景分类,从最常用到次常用。
10.1 导航:知道在哪、去哪
| 命令 | 作用 | 例子 |
|---|---|---|
pwd | 显示当前目录 | pwd → /Users/<your-username>/Desktop |
cd 目录 | 进入指定目录 | cd Desktop |
cd .. | 返回上一级 | |
cd ~ 或 cd | 回到家目录 | |
cd - | 返回上一次的目录 |
类比:
pwd= “我在哪?“,cd= “去哪儿”。
10.2 看:列文件、看内容
列出文件:
| 命令 | 作用 |
|---|---|
ls | 列当前目录的文件(简洁版) |
ls -l | 详细列表(权限/大小/时间) |
ls -lh | 同上 + 大小友好显示(K/M/G) |
ls -la | 同上 + 显示隐藏文件(以 . 开头) |
ls -lt | 按修改时间排序(新的在前) |
ls -lS | 按大小排序(大的在前) |
ls 目录 | 列指定目录的文件 |
看文件内容:
| 命令 | 作用 | 适合 |
|---|---|---|
cat 文件 | 一次全部输出 | 短文件 |
less 文件 | 分页显示(按 q 退出,/ 搜索) | 长文件 |
head 文件 | 看前 10 行 | 看开头 |
head -n 30 文件 | 看前 30 行 | |
tail 文件 | 看后 10 行 | 看结尾 |
tail -f 文件 | 实时追踪文件新增内容 | 看日志(最常用) |
看日志最常用
tail -f 日志文件,可以实时看到日志滚动。
10.3 文件操作:增删改
| 命令 | 作用 | 例子 |
|---|---|---|
mkdir 目录名 | 新建目录 | mkdir 新文件夹 |
mkdir -p a/b/c | 递归新建多级目录 | |
touch 文件名 | 新建空文件(或更新时间) | touch hello.txt |
cp 源 目标 | 复制文件 | cp a.txt b.txt |
cp -r 源目录 目标 | 复制目录(必须 -r) | cp -r 文件夹 备份 |
mv 源 目标 | 移动 / 重命名 | mv old.txt new.txt |
rm 文件 | 删除文件 | rm a.txt |
rm -r 目录 | 删除目录 | |
rm -rf 目录 | 强制递归删除(⚠️ 极危险) |
⚠️ rm 没有回收站! 删了找不回来。 红线:永远不要执行
rm -rf /(删根目录 = 系统毁灭)。
10.4 查找:找文件、找内容
| 命令 | 作用 | 例子 |
|---|---|---|
find 路径 -name 模式 | 按文件名找 | find . -name "*.pdf" 找所有 PDF |
find . -type d | 只找目录 | |
find . -mtime -7 | 找近 7 天修改的文件 | |
grep 关键词 文件 | 在文件里搜内容 | grep "error" log.txt |
grep -r 关键词 目录 | 递归搜索目录里所有文件 | |
grep -i 关键词 文件 | 忽略大小写 | |
grep -n 关键词 文件 | 显示匹配行的行号 |
类比:
find= “找文件本身”,grep= “找文件里的内容”。
10.5 权限管理(配合第九章使用)
| 命令 | 作用 |
|---|---|
chmod 权限 文件 | 改权限(如 chmod 755 a.sh) |
chmod +x 文件 | 给所有人加执行权限 |
chown 用户 文件 | 改文件所有者(需要 sudo) |
chown 用户:组 文件 | 同时改所有者和组 |
sudo 命令 | 以管理员身份运行命令 |
10.6 进程管理
| 命令 | 作用 |
|---|---|
ps | 查看当前用户的进程 |
ps aux | 查看所有进程(详细) |
top | 实时进程监控(按 q 退出) |
htop | 美化版 top(需 brew install htop) |
kill PID | 杀掉指定进程 |
kill -9 PID | 强制杀死(顽固进程用这个) |
pkill 进程名 | 按名字杀进程 |
10.7 系统信息
| 命令 | 作用 |
|---|---|
whoami | 我是谁(当前用户名) |
hostname | 主机名 |
uname -a | 系统信息(内核版本等) |
df -h | 磁盘空间使用情况 |
du -sh 目录 | 目录占用大小 |
free -h(Linux)/ vm_stat(Mac) | 内存使用 |
date | 当前时间 |
uptime | 系统已运行多久 |
id | 当前用户的 UID/GID/组信息 |
groups | 当前用户属于哪些组 |
10.8 网络相关
| 命令 | 作用 |
|---|---|
ping 域名/IP | 测试网络连通性 |
curl URL | 发请求/下载 |
curl -O URL | 下载文件(保留原文件名) |
curl -L URL | 跟随重定向 |
wget URL | 下载(Mac 默认没装,需 brew install wget) |
ssh 用户@主机 | 远程登录 |
scp 文件 用户@主机:路径 | 远程拷贝文件 |
ifconfig(Mac)/ ip a(Linux) | 查看网络接口 IP |
10.9 压缩解压
| 命令 | 作用 |
|---|---|
tar -czvf 包名.tar.gz 目录 | 打包并压缩 |
tar -xzvf 包名.tar.gz | 解压 tar.gz |
zip -r 包名.zip 目录 | zip 压缩 |
unzip 包名.zip | 解压 zip |
tar 参数助记:c=create / x=extract / z=gzip 压缩 / v=verbose 显示进度 / f=指定文件名
10.10 管道与重定向(Shell 的核心威力)
这是 Shell 真正强大的地方——把多个命令连起来用。
| 符号 | 作用 | 例子 |
|---|---|---|
| | 管道:把前一个命令的输出送给后一个 | ls -l | grep "pdf" 列出所有 PDF |
> | 输出重定向(覆盖写入文件) | ls > 文件列表.txt |
>> | 输出重定向(追加到文件) | echo "新内容" >> 日志.txt |
< | 输入重定向(从文件读) | wc -l < 文件 |
2> | 错误流重定向 | command 2> error.log |
&> | 标准输出+错误一起重定向 | command &> all.log |
&& | 前一个成功才执行后一个 | cd 目录 && ls |
|| | 前一个失败才执行后一个 | ping 域名 || echo 失败 |
; | 顺序执行(不管成败) | ls; pwd |
实战例子:
# 找出当前目录下最大的 5 个文件
ls -lhS | head -6
# 在所有 .md 文件里搜 "Transformer"
grep -r "Transformer" --include="*.md" .
# 统计当前目录有多少个文件
ls | wc -l
# 把命令历史保存到文件
history > 历史命令.txt
# 找当前目录最近 7 天修改过的所有 PDF
find . -name "*.pdf" -mtime -7
# 看哪个进程占内存最多
ps aux | sort -rk 4 | head -5💡 理解管道的关键:把命令想象成”工厂流水线”,
|就是”传送带”,每个命令处理上一个命令的输出。
10.11 救命神器(最高频)
| 命令/快捷键 | 作用 |
|---|---|
man 命令 | 看命令的详细帮助手册(按 q 退出) |
命令 --help | 看简要帮助 |
which 命令 | 查命令在哪个路径 |
history | 查看历史命令 |
Ctrl + C | 中断当前命令 |
Ctrl + D | 退出当前 Shell(同 exit) |
Ctrl + L | 清屏(同 clear) |
Ctrl + A | 光标跳到行首 |
Ctrl + E | 光标跳到行尾 |
Ctrl + R | 搜索历史命令(超好用) |
Tab | 自动补全(最常用!) |
↑ / ↓ | 翻历史命令 |
💡 救命三件套:忘记命令用法 →
man,忘记敲过什么 →history或Ctrl+R,半截不想敲了 →Ctrl+C。
10.12 Shell 自身相关
| 任务 | 命令 |
|---|---|
| 查看默认 Shell | echo $SHELL |
| 查看当前正在用的 Shell | echo $0 |
| 切换到 bash | bash |
| 切换到 zsh | zsh |
| 退出当前 Shell | exit 或 Ctrl+D |
| 永久换默认 Shell(Mac) | chsh -s /bin/bash |
| 列出系统所有可用 Shell | cat /etc/shells |
十一、新手常踩的 5 个坑
-
rm没有回收站 —— 删除是真删。养成习惯:先ls 路径确认要删的对象,再rm。 -
空格要转义 —— 文件名带空格的,要用引号包起来:
cd "我的 文件夹" # 推荐 cd 我的\ 文件夹 # 也行(反斜杠转义) -
.和..不一样 ——.是当前目录,..是上一级。例如cp 文件 .是复制到当前目录。 -
rm -rf是核武器 —— 永远先ls 路径确认目标再删。绝对不要rm -rf /或rm -rf $变量(变量为空时会变成rm -rf /)。 -
路径分大小写 ——
Desktop和desktop在 Linux 上是不同目录。macOS 默认不区分但强烈建议当成区分,跨平台时不会坑自己。
十二、学习路径建议
如果你是完全的小白,建议按这个顺序练:
- 先学导航:
pwd/cd/ls—— 能在终端里”走来走去” - 再学查看:
cat/less/head/tail—— 能看到文件内容 - 然后操作:
mkdir/touch/cp/mv/rm—— 能管理文件 - 学权限:第九章 +
chmod—— 能解决”权限不够”的报错 - 学查找:
find/grep—— 能找到东西 - 学管道:
|/>/>>—— 能把命令组合起来发挥威力 - 遇坑就查:
man 命令和命令 --help—— 自己解决问题
不需要一次记住所有命令。用得多的(
cd/ls/pwd/cat)自然就记住,用得少的(tar/scp)查的时候再看就行。