这是《与 Shell 对话》系列的第四篇。前三篇你学会了操作文件、搜索内容、用管道把命令串起来。这一篇从「操作文件」转向「操作计算机本身」——管理正在运行的程序、理解权限系统、查看系统状态,以及 macOS 特有的终端工具。学完这篇,你就能通过终端对整台电脑有全面的掌控感。
上一篇:流水线与重定向 · 下一篇:让你的 Shell 认识你
| 关键词 | 一句话说明 |
|---|---|
| 进程(Process) | 正在运行的程序——每个打开的应用都是一个或多个进程 |
| PID | 进程的唯一 ID 编号——杀进程时你需要这个数字 |
| 前台 / 后台 | 前台占用终端(你不能输入新命令),后台不占用(可以在它运行的同时做别的事) |
| 权限(Permission) | 文件或程序上的三组标记(所有者/组/其他人 × 读/写/执行) |
| sudo | 以超级用户身份执行命令——终端的"授权确认"按钮 |
| chmod | 修改文件权限——让脚本可以执行、让文件只读 |
| nohup | 让命令在关闭终端后继续运行——"不挂断" |
| sw_vers | 查看 macOS 版本号——Mac 专属 |
| pbcopy / pbpaste | 终端的剪贴板——把命令输出拷贝出来,或者把文字从剪贴板送进终端 |
| say | 让 Mac 开口说话——文字转语音 |
每一秒你的 Mac 都在同时运行几十上百个程序——浏览器标签、后台服务、系统守护进程。在终端里,你可以清晰地看到这一切。
psps aux # 列出系统上所有正在运行的进程
ps aux | head -20 # 前十行看看都有哪些列
ps aux 的输出列解读:
| 列 | 含义 |
|---|---|
| USER | 哪个用户启动的这个进程 |
| PID | 进程的唯一编号——杀进程时要这个数 |
| %CPU | 当前 CPU 占用百分比 |
| %MEM | 当前内存占用百分比 |
| VSZ / RSS | 虚拟内存 / 实际物理内存大小 |
| TT | 终端编号(?表示后台服务进程) |
| STAT | 进程状态(S = 休眠,R = 运行,T = 暂停) |
| STARTED | 启动时间 |
| TIME | 累计占用 CPU 的时间 |
| COMMAND | 命令名和参数 |
实用例子——用 grep 过滤出感兴趣的进程:
ps aux | grep "chrome" # Chrome 的所有进程(三四条算正常)
ps aux | grep -v "grep" # 排除 grep 命令自身(常见的管道技巧)
ps aux | grep "Terminal" # 终端自己
# 查看某个具体进程的信息
ps aux | grep "PID号"
toptop # 实时刷新,CPU 使用率最高的排最前
top 持续运行,每秒刷新一次。占用 CPU 最多的进程排在最前面。按 q 退出。你也可以指定只看特定数量的进程:
top -l 5 # 只刷新 5 次后自动退出
top -o mem # 按内存用量排序(macOS 特有)
top -n 10 # 只显示前 10 个进程(macOS 特有)
ps是"快照"——给你某一瞬间的完整画面。适合搜索特定进程。top是"监控器"——持续刷新,让你看到什么在吃 CPU。两个命令各有用途,都学。
kill 和 pkillkill 通过 PID 杀死进程,pkill 通过名字杀死进程:
kill 1234 # 给 PID 为 1234 的进程发终止信号
kill -9 1234 # 强制杀死(-9 = SIGKILL,不到万不得已不用)
pkill -i chrome # 按名字杀死进程(-i 忽略大小写)
pkill -f "进程全名" # 按完整命令行匹配杀死
信号的礼貌程度:
| 信号 | 写法 | 行为 | 什么时候用 |
|---|---|---|---|
| SIGTERM | kill PID | 请求进程自行退出 | 优先使用——给进程清理的机会 |
| SIGKILL | kill -9 PID | 强制杀死,无法被捕获 | 进程彻底卡死时最后的办法 |
⚠️ kill -9 不会给进程保存数据的机会。尽量先用不带 -9 的普通 kill,等几秒没反应再用强制信号。
&、Ctrl+Z、jobs、fg、bg这是终端多任务的基础——让程序在后台运行,终端不被占用。
# 在命令末尾加 &,让它在后台启动
sleep 30 & # sleep 30 会在后台等待 30 秒
[1] 12345 # Shell 告诉你:后台作业 1,PID 12345
# 查看后台作业
jobs
[1] + running sleep 30
# 把后台作业调到前台
fg %1 # 把作业 1 调回前台
# 前台运行时,按 Ctrl+Z 可以暂停它
# (假设 sleep 30 正在前台,按 Ctrl+Z)
^Z
[1] + suspended sleep 30
# 让暂停的作业在后台继续运行
bg %1
# 现在你可以继续输入新命令了
实际场景:你正在用 find 搜索大目录,突然想不起来另一个事情——按 Ctrl+Z 暂停搜索,查完之后 fg 继续搜。
记住这套流程:
命令 &直接后台 →jobs查看后台 →fg %编号调回前台 →Ctrl+Z暂停 →bg %编号在后台继续跑。这是一套完整的前后台生命周期。
后台运行(&)有一个局限:如果你关闭终端窗口,后台进程也会跟着退出。这是因为它依附于 Shell 会话。如果你想让程序在关闭终端后继续运行:
nohup 命令 & # 让命令在关闭终端后继续运行
nohup = No Hang Up(不挂断)。它让进程忽略 SIGHUP 信号——当终端关闭时,Shell 会向它启动的所有进程发送 SIGHUP,告诉它们"该结束了"。nohup 让进程无视这个信号。
# 实际场景:跑一个很长的 find,关掉终端去吃饭
nohup find ~ -name "*.md" > 找到的文件.txt &
# 关掉终端,吃完饭回来,发现输出已经写入了 找到的文件.txt
使用 nohup 后,默认会生成一个 nohup.out 文件存放输出。用重定向可以改变这个行为(如上例中的 > 找到的文件.txt)。
这是 macOS 特有的命令。有些任务需要电脑保持唤醒——比如正在下载大文件、正在渲染视频:
caffeinate find ~ -name "*.md" # 运行命令期间阻止系统自动睡眠
caffeinate -s # 屏幕关闭时依然保持系统清醒
caffeinate -t 3600 # 阻止自动睡眠一小时(3600 秒)
caffeinate & # 在后台运行,避免当前终端被占用
# 用 jobs 查看它,用 fg 调回前台然后 Ctrl+C 停止,
# 或者直接用 kill %1 终止
默认的 caffeinate 只阻止自动休眠——你用 pmset sleepnow 强制睡眠时仍然有效(还记得第一篇就讨论过的吗)。
和
nohup、caffeinate打交道时要记住:它们让你的命令独立于终端会话生存。这意味着你不能随便用Ctrl+C停掉它们了(除非你kill)。用之前确认你确实需要这个命令持续运行——而不是忘了关。
在第一篇的 ls -l 输出中,你已经见过每行开头的 drwxr-xr-x 这种字符串。现在是时候彻底读懂它了。
每个文件或文件夹上都有三组权限,分别针对三种角色:
d rwx r-x r-x
↑ ↑↑↑ ↑↑↑ ↑↑↑
文件类型 所有者 所属组 其他人
权限 权限 权限
| 角色 | 位置 | 说明 |
|---|---|---|
| 所有者(User) | 第 2–4 位 | 文件属于谁,谁就有这组权限 |
| 所属组(Group) | 第 5–7 位 | 与文件同属一个组的成员共享这组权限 |
| 其他人(Others) | 第 8–10 位 | 既不是所有者也不属于该组的人 |
每组三个字母:
| 字母 | 含义 | 对文件 | 对文件夹 |
|---|---|---|---|
r | 读(read) | 能看文件内容 | 能列出文件夹里的文件 |
w | 写(write) | 能修改文件 | 能在文件夹里增删文件 |
x | 执行(execute) | 能运行这个程序/脚本 | 能 cd 进去、访问里面的文件 |
差值是 - 表示没有该权限。所以 r-x 就是"可读、可执行、不可写"。
chmodchmod = Change Mode。最常用的两个场景:
# 场景一:让脚本可以执行(添加 x 权限)
chmod +x 脚本.sh # 所有人(所有者/组/其他人)加执行权限
chmod u+x 脚本.sh # 只给文件所有者加执行权限
# 场景二:让文件只读(去掉 w 权限)
chmod -w 重要文件.md # 所有人失去写权限
chmod u-w 重要文件.md # 只去掉所有者的写权限
# 场景三:用数字模式批量设置(不需要死记,用的时候查)
chmod 755 脚本.sh # 所有者rwx, 组r-x, 其他人r-x
chmod 644 文件.md # 所有者rw-, 组r--, 其他人r--
数字模式的对应规则(好奇再看,不需要背):r=4、w=2、x=1。把每组三个数字相加:rwx = 4+2+1 = 7,r-x = 4+0+1 = 5,r-- = 4+0+0 = 4。
有些操作普通用户不能做——比如安装系统级软件、修改系统文件、查看其他人的隐私文件夹。sudo(Super User DO)让你以管理员身份执行单条命令。
sudo 命令 # 以超级用户身份执行
sudo !! # 以 sudo 重新执行上一条命令("后悔了,刚才该加 sudo")
# 实际场景
sudo pmset sleepnow # 强制睡眠(普通用户也能做,sudo 只是例子)
sudo kill -9 进程PID # 杀死其他用户的进程
sudo ls /private/var/log # 查看系统日志目录
sudo 会要求你输入当前用户的密码。输入时屏幕上不会有任何显示(连星号都没有)——这是正常现象,不是键盘坏了。输完按回车即可。
⚠️
sudo的基本原则:只在需要的时候用,用完了立刻回到普通用户状态。 不需要sudo的命令不要加sudo——不是加了显得更厉害,是给系统多一层保护。sudo rm -rf /是经典的毁灭性命令——虽然现代 macOS 有保护机制阻止它,但仍然说明了一个道理:sudo 让命令获得完整权限的同时,也失去了安全的护栏。
whoami 和 idwhoami # 我是谁
aodesai
id # 我的用户 ID 和所属组
uid=501(aodesai) gid=20(staff) groups=20(staff),12(everyone),...
这两个命令在你需要确认当前身份时非常有用——特别是当你用了 sudo 后想知道自己是否还在超级用户状态。
这一组命令回答关于电脑本身的问题:什么系统、跑了多久、什么配置。
sw_vers 和 unamesw_vers # macOS 版本信息(Mac 专属)
ProductName: macOS
ProductVersion: 15.5
BuildVersion: 24F2024
uname -a # 完整系统信息(跨平台通用)
Darwin MacBook-Pro 24.2.0 ... arm64
sw_vers 是 macOS 特有的简洁版本查看器。uname -a 是跨平台的,在 Linux 上也能用,显示内核版本和架构。
uptimeuptime # 电脑跑了多久没关机了
10:30 up 3 days, 2:15, 2 users, load averages: 1.8 2.1 2.3
从左到右:当前时间、系统已运行了 3 天 2 小时 15 分、当前登录用户数、最近 1/5/15 分钟的平均负载(数字越低越空闲)。
date 和 caldate # 当前日期时间
2026年 6月 3日 星期三 10:30:00 CST
date "+%Y-%m-%d" # 自定义格式:年-月-日
2026-06-03
cal # 本月日历
cal 2026 # 全年日历
cal 6 2026 # 指定年月的日历
date 的名称格式控制(+%Y-%m-%d)值得记住——在脚本中经常用 date "+%Y%m%d_%H%M%S" 给备份文件加上时间戳。
sysctl 和 system_profilersysctl -n hw.memsize # 内存大小(字节)
sysctl -n hw.ncpu # CPU 核心数
sysctl -n machdep.cpu.brand_string # CPU 型号
# system_profiler 输出非常详细,可以 grep 过滤
system_profiler SPHardwareDataType | grep "Chip\|Memory\|Serial"
system_profiler 是 macOS 的图形化"系统信息"的终端版——信息量极大,建议总是配合 grep 使用。
这些命令在你需要描述电脑配置时非常实用——比如发帖求助、买配件前确认型号、或者单纯好奇你的 M1 芯片跑了多久没关机了。
以下命令在 Linux 上不存在——它们是 macOS(及其前身 BSD)独有的。正因为独特,所以特别值得了解。
pbcopy 和 pbpaste这是实用价值最高的 macOS 特有命令。它把你的终端和系统剪贴板连接起来。
# 把命令输出拷贝到剪贴板
cat ~/.zshrc | pbcopy # 配置内容已复制到剪贴板,可以 Command+V 粘贴到任何地方
# 更短的写法(重定向也支持)
pbcopy < ~/.zshrc # 同上
# 从剪贴板读取内容
pbpaste # 把剪贴板里的内容打印到终端
pbpaste | grep "alias" # 粘贴板里搜别名
pbpaste > 临时.txt # 剪贴板内容存入文件
实际场景:你在终端里 grep -r "bug" src/ | pbcopy,然后直接粘贴到聊天软件里发给同事——不需要鼠标选中、右键复制那一套。
saysay "你好" # Mac 会开口说"你好"
say -v Tingting "你好" # 指定中文语音(Tingting = 中文女声)
# 实际场景一:当长命令跑完时通知你
sleep 10 && say "命令跑完了" # 10 秒后告诉你
# 实际场景二:整点报时(配合 cron 或循环)
say "现在是下午三点了"
# 列出所有可用的语音
say -v "?" | less # | less 防止输出太长刷屏
配合管道使用——让 Mac 把命令的输出来"读"给你:
echo "明天多云转晴" | say # 播报天气
date "+%Y年%m月%d日" | say # 播报日期
open 和 defaultsopen 在第一篇已经学过。这里补充两个常用变体:
open -a "Safari" # 打开 Safari
open -a "System Settings" # 打开系统设置
open https://www.baidu.com # 在默认浏览器中打开网址
defaults 是 macOS 隐藏设置的开关——许多系统偏好设置里没有的选项可以通过它修改:
# 查看某个应用的隐藏设置(以 Finder 为例)
defaults read com.apple.finder
# 显示隐藏文件(需要重启 Finder)
defaults write com.apple.finder AppleShowAllFiles -bool true
killall Finder # 退出 Finder(macOS 会自动重启它,从而读取新设置)
# killall 和 kill 的区别:kill 按 PID 杀,killall 按进程名杀
# 恢复——不显示隐藏文件
defaults write com.apple.finder AppleShowAllFiles -bool false
killall Finder
⚠️ defaults 可以修改系统层面的行为,用之前最好先搜索确认你要改的 key 是什么意思,避免改出奇怪的问题。
pbcopy/pbpaste是每天都会用到的实用工具。say和defaults是偶尔用但很有味道的冷门功能。open是终端和图形界面的最后一座桥梁。这四个命令构成了 macOS 独有的终端体验——在其他操作系统上你找不到它们。
这次的练习围绕"了解你的电脑正在做什么"展开。
找出当前占用 CPU 最多的 5 个进程。
ps aux | sort -nrk 3 | head -5
# 这里 sort 的选项拆开看:
# -n 按数字排序(不是字典序)
# -r 倒序(最大的排最前)
# -k 3 只看第 3 列(%CPU)——这叫"指定排序列"
# 组合起来:按 %CPU 数字从大到小排列,取前 5
当你用 ps aux | grep chrome 时,grep 自己的进程也会出现在结果中。用学过的技巧去掉这一行。
ps aux | grep chrome | grep -v grep
用一条命令同时显示运行时间和系统版本。
uptime
sw_vers
把你的 Mac 型号和内存信息复制到剪贴板,这样在任何地方都能 Command+V 粘贴。
system_profiler SPHardwareDataType | grep "Chip\|Memory" | pbcopy
# 现在打开任意文本编辑器,Command+V 试试
跑一个耗时的搜索(如 find ~ -name "*.pdf"),跑完后自动播报完成。
find ~ -name "*.pdf" > pdf清单.txt && say "搜索完成"
# && 的意思是:前一条命令成功后,再执行后面的。
# 如果 find 因为某种原因失败了,say 就不会执行。
# 这是 Shell 中的"短路求值"——只有在左边的命令
# 成功(退出码为 0)时,右边的命令才会运行。
到这一篇为止,你已经不再只是一个"文件操作者"了。你能看进程、杀进程、管理后台任务、理解权限、查看系统信息、用 Mac 特有的工具链。终端不再是你的"旁观窗口"——它是你操纵整台电脑的驾驶舱。
| 命令 | 作用 | 最常用法 |
|---|---|---|
ps | 查看进程快照 | ps aux | grep 关键词 |
top | 实时查看进程 | top → q 退出 |
kill | 按 PID 终止进程 | kill PID kill -9 PID(强制) |
pkill | 按名字终止进程 | pkill -i 进程名 |
& | 后台运行 | 命令 & |
Ctrl+Z | 暂停前台进程 | 暂停后可用 bg 放后台 |
jobs | 列出后台作业 | jobs fg %编号 |
nohup | 关闭终端后仍运行 | nohup 命令 & |
chmod | 修改文件权限 | chmod +x 文件 chmod 755 文件 |
sudo | 超级用户执行 | sudo 命令 sudo !! |
whoami | 显示当前用户 | 无参数 |
sw_vers | macOS 版本 | 无参数 |
uptime | 运行时长 | 无参数 |
date | 日期时间 | date "+%Y-%m-%d" |
pbcopy | 输出→剪贴板 | 命令 | pbcopy |
pbpaste | 剪贴板→终端 | pbpaste pbpaste | grep 文字 |
say | 文字转语音 | say "文字" echo "文字" | say |
trap 捕获信号ps -ejH 以树状结构显示killall——和 pkill 类似但更激进,按完整进程名匹配杀死nice 和 renice——调整进程的 CPU 优先级,让某些进程少抢资源chmod 644 中的 6/4/4 分别对应 rw-/r--/r--