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脚本后缀
macOSTerminal.app(自带) / iTerm2(第三方)zsh(2019 起).sh
LinuxGNOME Terminal / Konsole 等bash.sh
WindowsWindows Terminal(新)/ CMD 窗口(老)cmd.exePowerShell.bat / .cmd / .ps1
Windows + WSLWSL 终端bash(Linux 子系统).sh

一句话总结:Mac → zsh,Linux → bash,Windows → PowerShell。


四、常见 Shell 类型详解

Shell出生年代说明
sh1977最古老的 Shell,兼容性最好,是 bash/zsh 的祖宗
bash1989Linux 默认 Shell,最通用,全名 “Bourne-Again SHell”
zsh1990macOS 默认(2019 起替代 bash),功能更丰富,插件生态强
fish2005新一代 Shell,语法友好但不兼容 bash
cmd.exe1987Windows 老式命令行,DOS 时代遗留
PowerShell2006微软新一代,面向对象,功能强大,可跨平台

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/zshCMDPowerShellWSL
.sh
.bat / .cmd
.ps1

特殊情况:PowerShell 能跑 .bat(自动调用底层 cmd.exe),但反过来不行。

曲线救国方案

需求方法
Windows 上跑 .sh安装 WSLGit 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 字母权限

权限有两种写法,等价

字母数字含义
r4
w2
x1执行
-0

三组权限相加变成 3 位数字:

字母权限计算数字权限
rwx4+2+1=77
rw-4+2+0=66
r-x4+0+1=55
r--4+0+0=44
---00

常见组合:

数字字母适用场景
644rw-r--r--普通文件(默认)
755rwxr-xr-x可执行脚本、目录
600rw-------私密文件(如 SSH 密钥)
777rwxrwxrwx完全开放(很危险,不要用

改权限命令:

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 源目录 目标复制目录(必须 -rcp -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,忘记敲过什么 → historyCtrl+R,半截不想敲了 → Ctrl+C

10.12 Shell 自身相关

任务命令
查看默认 Shellecho $SHELL
查看当前正在用的 Shellecho $0
切换到 bashbash
切换到 zshzsh
退出当前 Shellexit 或 Ctrl+D
永久换默认 Shell(Mac)chsh -s /bin/bash
列出系统所有可用 Shellcat /etc/shells

十一、新手常踩的 5 个坑

  1. rm 没有回收站 —— 删除是真删。养成习惯:先 ls 路径 确认要删的对象,再 rm

  2. 空格要转义 —— 文件名带空格的,要用引号包起来:

    cd "我的 文件夹"      # 推荐
    cd 我的\ 文件夹       # 也行(反斜杠转义)
  3. ... 不一样 —— .当前目录..上一级。例如 cp 文件 . 是复制到当前目录。

  4. rm -rf 是核武器 —— 永远先 ls 路径 确认目标再删。绝对不要 rm -rf /rm -rf $变量(变量为空时会变成 rm -rf /)。

  5. 路径分大小写 —— Desktopdesktop 在 Linux 上是不同目录。macOS 默认不区分但强烈建议当成区分,跨平台时不会坑自己。


十二、学习路径建议

如果你是完全的小白,建议按这个顺序练:

  1. 先学导航pwd / cd / ls —— 能在终端里”走来走去”
  2. 再学查看cat / less / head / tail —— 能看到文件内容
  3. 然后操作mkdir / touch / cp / mv / rm —— 能管理文件
  4. 学权限:第九章 + chmod —— 能解决”权限不够”的报错
  5. 学查找find / grep —— 能找到东西
  6. 学管道| / > / >> —— 能把命令组合起来发挥威力
  7. 遇坑就查man 命令命令 --help —— 自己解决问题

不需要一次记住所有命令。用得多的(cd/ls/pwd/cat)自然就记住,用得少的(tar/scp)查的时候再看就行。