Mac 终端命令使用
Shell(壳):和操作系统内核(Kernel)相对,Shell 是面向用户的命令行交互程序,属于命令解析器。接收用户输入的指令,调用系统程序完成对应的工作。
版本提示:macOS 10.15(Catalina)之前默认 Shell 为 Bash;从 Catalina 版本起系统默认 Shell 切换为 Zsh。绝大多数日常命令二者完全兼容。
Bash(Bourne‑Again Shell):Bourne Shell 的开源增强兼容版本,语法是 Bourne Shell 的超集,完全向后兼容,扩展大量实用特性。
在 Mac 终端 Shell 环境下,可以执行绝大多数 Unix / Linux 风格命令,例如 ls、cd、cat 等。但部分工具(sed、ps、top)属于 BSD 版本,和 GNU‑Linux 参数存在差异,编写跨平台脚本时需要注意。
macOS、Linux、Unix 的关系
通俗理解:Unix 是鼻祖;Linux 遵循 POSIX 标准从零实现的类 Unix 内核;macOS 的 Darwin 内核基于 BSD(Unix 的分支)二次开发,属于经过认证的正统 Unix 系统。
Unix
1969 年,贝尔实验室 Ken Thompson 在 PDP‑7 机器启动开发,后续 Dennis Ritchie 加入合作,诞生最早的 Unix。早期使用汇编语言,第三版改用 C 语言完成重写,因此获得硬件可移植能力。
Unix 是多用户、多任务商业操作系统,可运行在巨型机、小型机、PC 等多种硬件平台。 主流商业 Unix 产品:
- Solaris(Sun)
- AIX(IBM)
- HP‑UX(HP)
- SCO Unix / Unixware(x86 平台)
备注:Unix 源码闭源,大多和厂商硬件深度绑定。
Linux
Linus Torvalds 大学期间受教学操作系统 Minix 的启发,在 Intel 386 PC 上从零开发内核。Linux 没有复用任何 Unix 源码,遵循 POSIX 标准独立实现,大量搭配 GNU 项目工具链组成完整操作系统。
严格定义:Linux 仅指代内核;我们口中的 Linux 系统 = Linux内核 + GNU工具链 + 各类应用程序,属于类Unix开源操作系统。
主流商业发行版:RedHat、SUSE、Slackware、Turbo Linux、红旗Linux。
macOS
macOS 的内核为 Darwin(达尔文),底层基于 XNU(Mach微内核 + BSD子集) 开发,是通过官方认证的正统 Unix 系统。
层级关系:macOS 系统 → Darwin内核 → XNU(Mach + BSD) → BSD(Unix分支)
Unix 与 Linux 核心差异
- 授权与源码:Unix 商业闭源;Linux 内核完全开源免费。
- 硬件绑定:Unix 大多绑定对应厂商硬件;Linux 可跨多种硬件平台运行。
- 历史渊源:Unix 诞生更早;Linux 设计思想借鉴 Unix,但源码完全独立。
Linux 与 macOS 的核心差异
- 二者都属于类 Unix;macOS 是经过认证正统 Unix;Linux 属于类 Unix。
- 内核架构:Linux 采用宏内核;macOS Darwin 是混合内核(XNU)。
- 代码起源:Linux 由 Linus 从零开发;Darwin 基于 Mach + BSD 源码二次修改而来。
- 工具差异:macOS 自带 BSD 系工具,Linux 大多是 GNU 工具,部分命令参数不一样。
Mac 终端快捷键
Tab # 命令、文件/文件夹自动补全
Ctrl + A # 光标跳转到当前命令行开头
Ctrl + E # 光标跳转到当前命令行末尾
Ctrl + L # 清空终端屏幕(等价 clear)
Ctrl + U # 删除光标位置到行首全部字符
Ctrl + K # 删除光标位置到行尾全部字符
Ctrl + W # 删除光标前一个单词
Mac 终端常用命令大全
Mac 和 Linux 绝大多数命令用法一致,但部分底层工具是 BSD 实现,参数会有区别。
目录操作
| 命令 | 功能描述 | 使用示例 |
|---|---|---|
| cd | 切换工作目录 | cd ~、cd ..、cd /usr/local |
| ls | 列出目录下文件与文件夹 | ls -alh |
| pwd | 打印当前所在目录的绝对路径 | pwd |
| mkdir | 创建目录,‑p 递归创建多级目录 |
mkdir demo、mkdir -p a/b/c |
| rmdir | 仅删除空目录,目录有文件会报错 | rmdir demo |
文件操作
| 命令 | 功能描述 | 使用示例 |
|---|---|---|
| cat | 读取文件全部内容输出到标准输出,也可拼接文件 | cat test.txt |
| more | 老式分页查看大文件 | more app.log |
| od | 八进制/十六进制查看原始二进制字节 | od demo.bin |
| cp | 复制文件/目录;‑r递归复制目录 |
cp src.txt dest.txt、cp -r dir1 dir2 |
| rm | 删除文件/目录;‑r递归删除目录,‑f强制删除 |
rm test.txt、rm -rf dir |
| mv | 移动文件,同时可实现重命名 | mv old.txt new.txt、mv file ~/Desktop |
| ln | 创建硬链接 / 软链接(符号链接),‑s 创建软链接 |
ln src hardlink、ln -s src softlink |
| find | 递归遍历目录,按条件查找文件 | find . -name "*.js" |
| file | 探测识别文件真实类型 | file demo.zip |
| open | Mac 特有命令,调用系统默认程序打开文件/文件夹 | open .、open demo.pdf |
文本处理操作
| 命令 | 功能描述 | 使用示例 |
|---|---|---|
| head | 读取文件开头N行 | head -20 test.txt |
| tail | 读取文件末尾N行;‑f 实时跟踪文件新增日志 |
tail -15 test.txt、tail -f app.log |
| cut | 按列、分隔符截取文本内容 | cut -d ':' -f1 /etc/passwd |
| colrm | 删除标准输入指定列范围的字符 | colrm 2 5 < test.txt |
| paste | 将多个文件按列合并输出 | paste file1.txt file2.txt |
| diff | 对比两个文件的差异 | diff a.txt b.txt |
| sed | 流编辑器,完成文本替换、删除、修改 | sed 's/red/green/g' test.txt |
| grep | 文本模式匹配搜索,支持正则表达式 | grep "error" app.log |
| awk | 强大文本脚本处理工具,适合解析结构化文本 | awk '{print $1}' test.txt |
| sort | 对文本行进行排序 | sort file.txt |
| uniq | 去除文件重复行,建议先 sort 再 uniq | `sort file.txt |
| comm | 对比已经排好序的两个文件,输出交集、差集 | comm sorted1.txt sorted2.txt |
| wc | 统计文件行数、单词数、字节数 | wc -l test.txt |
| nl | 为文本内容增加行号输出 | nl test.txt |
权限与安全操作
| 命令 | 功能描述 | 使用示例 |
|---|---|---|
| passwd | 修改当前用户登录密码 | passwd |
| chmod | 修改文件/目录读写执行权限 | chmod u+x run.sh |
| umask | 设置新建文件、目录的默认权限掩码 | umask 027 |
| chown | 修改文件/目录的所有者用户,修改系统文件需要 sudo | sudo chown admin demo.txt |
| chgrp | 修改文件/目录的所属用户组 | sudo chgrp staff demo.txt |
备注:xlock 命令现代 macOS 已经废弃,不再用于终端锁屏。
编译开发操作
| 命令 | 功能描述 | 使用示例 |
|---|---|---|
| make | 读取 Makefile,编译构建项目 | make、make install |
| touch | 修改文件时间戳;文件不存在时创建空文件 | touch demo.txt |
进程管理
| 命令 | 功能描述 | 使用示例 |
|---|---|---|
| ps | 查看进程快照;ps aux 查看系统全部进程 |
ps aux |
| kill | 向进程发送信号;‑9 发送SIGKILL强制杀死进程 |
kill 1234、kill -9 1234 |
| nice | 设置新启动进程的调度优先级 | nice -n 10 ./app |
| renice | 修改已经在运行进程的调度优先级 | renice +20 32768 |
时间日期操作
| 命令 | 功能描述 | 使用示例 |
|---|---|---|
| date | 输出系统当前日期时间,也可用于格式化时间 | date |
| cal | 输出日历 | cal 8 2025 |
| time | 统计一条命令的执行耗时 | time ls -l |
网络与通信操作
注意:现代 macOS 已经移除 rlogin、rsh,明文不安全,远程优先使用 ssh。
| 命令 | 功能描述 | 使用示例 |
|---|---|---|
| telnet | 老式远程登录;现在多用于简单端口探测 | telnet baidu.com 80 |
| ftp | 传统明文ftp客户端 | ftp ftp.example.com |
| ping | ICMP 探测网络连通性 | ping www.baidu.com |
| 读取、发送系统邮件 | mail |
|
| write | 向本机其他登录终端发送消息 | write username ttys001 |
| mesg | 开启/关闭接收 write 消息 | mesg n |
Shell 内置工具(历史、别名)
r 是 Ksh 内置命令,macOS 默认 Zsh/Bash 没有 r 命令。
| 命令 | 功能描述 | 使用示例 |
|---|---|---|
| history | 输出终端执行过的全部命令历史 | history |
| alias | 创建命令别名,简化输入 | alias ll='ls -alh' |
| unalias | 删除已定义的命令别名 | unalias ll |
其他综合命令
| 命令 | 功能描述 | 使用示例 |
|---|---|---|
| uname | 查看系统内核信息,‑a输出完整信息 |
uname -a |
| clear | 清空终端屏幕 | clear |
| env | 打印全部当前环境变量 | env |
| who | 列出当前系统所有登录用户 | who |
| whoami | 打印当前终端登录用户名 | whoami |
| tty | 打印当前终端设备文件名 | tty |
| stty | 查看、修改终端设备控制参数 | stty -a |
| du | 统计目录磁盘占用大小,‑sh人类可读格式 |
du -sh * |
| df | 查看磁盘分区总容量、剩余空间 | df -h |
| w | 输出登录用户信息 + 系统负载综合信息 | w |
常见问题
cd、pushd、popd、dirs 的区别
Shell 维护一块目录栈,以栈结构保存访问过的目录,dirs 可以打印栈内全部记录。
cd:普通切换目录,不会修改目录栈。pushd 目录:将目标目录压入目录栈栈顶,同时切换到该目录;不带参数时,交换栈顶两条目录记录。popd:弹出目录栈栈顶记录,切换到新的栈顶目录。dirs:查看完整目录栈。
pushd ~/Documents
pushd ~/Desktop
dirs
popd
pwd
popd
pwd
如何查找并杀死进程
开发中经常需要杀掉占用端口的进程:
# 查看系统全部进程快照
ps aux
# Mac 根据端口查找进程
lsof -i :8080
# -9 代表 SIGKILL,强制杀死进程,谨慎使用
kill -9 <PID>