第 3 章 终端、Homebrew 与命令行
macOS 底下是个完整的 Unix。终端不是给程序员专用的附加功能,它是系统自带的、跟图形界面平级的入口。 很多在设置面板里翻半天找不到的东西,一条命令就解决了。
这一章从「终端在哪、默认 shell 是什么」讲到 Homebrew 安装、PATH 原理,最后给一张从 Windows 命令行的对照表。
一、终端在哪,默认用什么 shell
终端.app 在 /Applications/Utilities/(实用工具文件夹),
最快是 ⌘Space 输「终端」回车。
从 macOS Catalina 开始,默认 shell 从 bash 换成了 zsh。 查当前用的是哪个:
echo $SHELL
# 一般输出 /bin/zsh
# 查版本
zsh --version
配置文件的读取顺序
这是最容易搞混的地方。zsh 启动时按顺序读这几个文件,后读的会覆盖前面:
/etc/zshrc——系统级,不要改。~/.zshenv——每次启动都读,包括非交互场景。环境变量放这里。~/.zprofile——登录 shell 时读一次。Homebrew 的 PATH 官方建议写这里。~/.zshrc——交互式 shell 每次打开都读。别名、提示符、插件写这里。~/.zlogin——登录 shell 最后读。
实际使用中,90% 的情况只需要管 ~/.zshrc 和 ~/.zprofile 两个文件。
改完要生效:
source ~/.zshrc
二、Homebrew:macOS 的包管理器
Homebrew 解决的是「装命令行工具」这件事。没有它,你要自己下源码、编译、处理依赖;
有了它,brew install 一行搞定,卸载也干净。
安装
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
装完必须做的一步:把 brew 加进 PATH
这一步漏掉,后面所有 brew 命令都会报 command not found。
而且 Apple 芯片和 Intel 机器的路径不一样:
| 机型 | 安装前缀 |
|---|---|
| Apple 芯片(M 系列) | /opt/homebrew |
| Intel | /usr/local |
# Apple 芯片
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
# Intel
echo 'eval "$(/usr/local/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/usr/local/bin/brew shellenv)"
# 验证
brew --prefix
brew doctor
brew --prefix 输出 /opt/homebrew 就对了。
brew doctor 会检查环境问题,有警告不一定都要处理,但报 Warning: /usr/local/bin is not writable 这类要看一下。
常用命令
brew install wget # 装命令行工具
brew install --cask firefox # 装图形界面 App
brew search 关键词 # 搜索
brew list # 已装的
brew outdated # 哪些有新版本
brew upgrade # 全部升级
brew upgrade wget # 只升级某个
brew uninstall wget # 卸载
brew cleanup # 清理旧版本缓存
brew services list # 后台服务状态
brew services start nginx # 启动服务并设为开机自启
# 查看 brew 装的东西占了多大
du -sh $(brew --prefix)
brew一律不要加sudo。 加了 sudo 会让文件属主变成 root,之后 brew 会因为权限混乱拒绝工作, 修起来要sudo chown -R一大串。官方文档里明确写了不要用 sudo。
三、PATH 到底是什么
「command not found」是新手遇到最多的报错,九成跟 PATH 有关。
PATH 是一串用冒号分隔的目录。你在终端输一个命令名,系统就按顺序去这些目录里找同名可执行文件, 找到第一个就用那个。
# 看当前 PATH(冒号分隔,读起来费劲)
echo $PATH
# 展开成一行一个,好读
echo $PATH | tr ':' '\n'
# 查某个命令实际用的是哪个文件
which python3
type -a python3 # 列出所有同名命令
# 临时加一个目录(只在当前窗口有效)
export PATH="/my/tool/bin:$PATH"
注意 $PATH 放在后面还是前面决定了优先级:
export PATH="/new:$PATH" 是新目录优先,export PATH="$PATH:/new" 是原有优先。
想覆盖系统自带的同名命令,必须放前面。
zsh 的一个坑:hash 缓存
zsh 会缓存命令路径。如果你刚装了一个新版本的同名工具,可能还在用旧的。
hash -r # 清掉缓存
rehash # 等价
四、sudo 和权限
sudo 是「以 root 身份执行这一条命令」。它会要你输自己的密码(不是 root 密码,macOS 默认没有 root 密码)。
- sudo 只对这一条命令有效,不是进入 root 模式。
- 连续用 sudo 会有一小段时间免密(默认 5 分钟)。
- 想开一个 root shell 用
sudo -s,但不建议——忘了自己在 root 里,一条rm -rf就能毁掉系统。 - 输密码时屏幕不显示任何字符(连星号都没有),这是正常的,照打回车。
# 查自己是不是管理员
groups
# 输出里有 admin 就是
# 给某个用户加管理员
sudo dscl . -append /Groups/admin GroupMembership 用户名
五、Windows 命令行对照
| 要做的事 | Windows | macOS |
|---|---|---|
| 列目录 | dir |
ls -la |
| 切换目录 | cd /d D:\x |
cd /Volumes/x |
| 查 IP 配置 | ipconfig /all |
ifconfig |
| 测连通 | ping -n 4 h |
ping -c 4 h |
| 查端口占用 | netstat -ano |
lsof -i :8080 |
| 查进程 | tasklist |
ps aux |
| 结束进程 | taskkill /PID n |
kill -9 n |
| 刷 DNS 缓存 | ipconfig /flushdns |
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder |
| 用默认程序打开 | start 文件 |
open 文件 |
| 复制输出到剪贴板 | clip |
pbcopy |
| 从剪贴板粘贴 | — | pbpaste |
| 清屏 | cls |
clear 或 ⌘K |
| 查文件类型 | assoc |
file 文件名 |
六、日常最常用的十几条
# 当前目录打开访达
open .
# 用某个程序打开
open -a "Visual Studio Code" 文件.txt
# 递归找文件
find . -name "*.log" -mtime -1
# 找内容(比 grep -r 快)
grep -rn "关键词" --include="*.py" .
# 看目录一共多大,按大小排序
du -sh * | sort -h
# 看磁盘剩余
df -h /
# 系统日志(最近 5 分钟)
log show --last 5m --predicate 'process == "kernel"'
# 看谁在监听端口
lsof -iTCP -sTCP:LISTEN -P -n
# 下载文件
curl -O https://example.com/file.zip
# 看 HTTP 响应头(排查缓存/CDN 时用)
curl -I https://example.com
# 压缩成 zip
zip -r 结果.zip 目录/
# 解压
unzip 结果.zip
# 算文件哈希
shasum -a 256 文件名
七、几个能省事的终端技巧
- 拖文件进终端 = 自动填完整路径。不用手打带空格的路径。
Tab补全,连按两次列出所有可能。Ctrl+R反向搜索历史命令,输几个字母就能找到上次那条。!!重复上一条命令。sudo !!= 用 sudo 重跑上一条(忘记加 sudo 时用)。Ctrl+A跳到行首,Ctrl+E行尾,Ctrl+U删到行首,Ctrl+W删一个词。⌘K清屏(比clear更彻底,连滚动缓冲一起清)。⌘T新标签页,⌘⇧[/⌘⇧]切标签。- 右键标题栏可以改标签页名字,几十个窗口时有用。
八、想更好看点就装个 iTerm2
系统自带的终端够用,但如果每天要开十几个标签,iTerm2 值得一装:
brew install --cask iterm2
它的好处是分屏(⌘D 竖分、⌘⇧D 横分)、搜索(⌘F)、
粘贴历史、以及可以给每个配置不同配色。
再往上一层是 Oh My Zsh(主题和插件管理)或者更轻的 starship(提示符)。 这两个不是必需,装了会让提示符显示 git 分支、当前目录、命令耗时。
# 轻量方案:starship
brew install starship
echo 'eval "$(starship init zsh)"' >> ~/.zshrc
下一章:软件的安装、卸载与放行 →