第 6 章 · 软件包管理与环境变量
本章目标:在 Ubuntu 上用 apt 正确安装、卸载、查询软件;理解 PATH 为何决定「命令找不找得到」;为 shop-demo 配置 .env 环境变量,且绝不把密钥提交 Git;分清 update 与 upgrade。
学时建议:3.5~4 小时(含 2 小时跟练)
前置:完成 linux-shell ch05;能使用 sudo(ch03)。
6.1 场景说明:新人第一天装环境
你刚加入商城后端组,Leader 发你一份 checklist:
- 装
git、curl、jq(查 JSON 日志) - 把 shop-demo 跑起来,需要读
configs/.env.local里的DB_HOST、API_PORT - 服务器上不能把数据库密码写进代码仓库
同事说:「Windows 上双击安装包就行;Linux 用 apt,配置用 环境变量。」
本章就在你的 WSL / Ubuntu 上,把这三件事一次性练会——和 ch13 装 Docker/Go、gin-web 读 DSN、git-collab ch02 的 .gitignore 全串起来。
6.2 学完你能(对照验收)
| 能力 | 你怎么证明会了 |
|---|---|
| apt 工作流 | 能说出先 update 再 install 的原因 |
| 装/卸/查包 | 独立安装 htop,用 dpkg -l 确认 |
| PATH | 解释 command not found 时先查什么 |
| 持久环境变量 | 把 ~/dev-workspace/bin 加进 PATH 并新开终端仍有效 |
| .env 规范 | 有 .env.example + .env.local,且 local 在 gitignore 里 |
| 安全 | .env.local 权限 600,不会 git add 它 |
6.3 apt 是什么:Linux 的「应用商店后台」
Ubuntu 用 apt(Advanced Package Tool)从软件源下载安装 .deb 包。软件源列表在 /etc/apt/sources.list 和 /etc/apt/sources.list.d/,不用手改,知道存在即可。
两个最容易混的命令:
| 命令 | 干什么 | 类比 |
|---|---|---|
sudo apt update | 刷新「商店商品目录」 | 刷新 App Store 列表,不自动升级已装 App |
sudo apt upgrade | 把已安装的包升到目录里最新版 | 一键更新已装 App |
为什么 必须先 update 再 install:否则 apt 用的是旧目录,可能报 Unable to locate package 或装到旧版本。
6.4 跟练:第一次完整 apt 流程
步骤 1 — 更新目录
sudo apt update
你应该看到:末尾 Reading package lists... Done,以及若干 Hit: / Get: 行;不应大面积 Err:(若 Err 持续,见本章常见错误:网络/源)。
步骤 2 — 搜索包(不确定全名时)
apt search ^htop$
apt search jq | head -5
读懂输出:左边包名,右边简短描述。^htop$ 是精确匹配技巧(选修)。
步骤 3 — 查看包详情(装之前看一眼)
apt show curl | head -20
你应该看到:Version、Installed-Size、Depends 等。生产装软件前看 Depends 可避免缺依赖。
步骤 4 — 安装(本章固定装三个工具)
sudo apt install -y htop tree jq
-y 表示全默认「是」,脚本里常用;交互练习时可去掉 -y 体验确认提示。
步骤 5 — 验证真的装上了
which htop tree jq
htop --version 2>/dev/null || htop -V 2>/dev/null || echo "htop 已安装,按 q 退出"
jq --version
dpkg -l | grep -E 'htop|tree|jq'
验收表:
| 检查 | 命令 | 期望 | |
|---|---|---|---|
| 命令在 PATH 里 | which jq | 如 /usr/bin/jq | |
| 包状态 ii | dpkg -l jq 行首 | ii = 已安装正常 | |
| jq 能跑 | `echo '{"a":1}' \ | jq .a` | 输出 1 |
步骤 6 — 卸载(可选,练完 remove)
sudo apt remove -y tree
dpkg -l | grep tree # 应无 ii,或显示 rc(残留配置)
sudo apt install -y tree # 装回来,后面还要用
| 卸载方式 | 命令 | 配置文文件 |
|---|---|---|
| remove | apt remove pkg | 通常保留 |
| purge | apt purge pkg | 一并删除 |
6.5 跟练:upgrade 与系统安全
sudo apt upgrade -y
你应该看到:要么「0 upgraded」,要么列出将升级的包。为什么 定期 upgrade:安全补丁;教学机每月做一次即可。
不要 在生产业务高峰随意 upgrade 后不测服务——ops-deploy 有变更窗口;本章个人 WSL 随意。
6.6 PATH:系统去哪找命令
输入 git 时,Shell 按 PATH 里列出的目录顺序找可执行文件。
步骤 1 — 看当前 PATH
echo $PATH
你应该看到:一串用 : 分隔的路径,通常含 /usr/bin、/bin、/usr/local/bin。
步骤 2 — 命令找不到时怎么查
type ls
type git
type nonexistent-cmd-xyz 2>&1
which git
读懂:type 告诉你是内置、别名还是外部命令;which 只查 PATH 里的外部命令。
为什么 ch05 的 unit 里 ExecStart 必须写绝对路径或保证 PATH 正确:systemd 的 PATH 往往比交互 Shell 短,所以生产 unit 常写 /usr/bin/xxx。
6.7 跟练:自建 bin 目录并加入 PATH
团队有时把内部脚本放在 ~/dev-workspace/bin。
步骤 1 — 写一个小脚本
mkdir -p ~/dev-workspace/bin
cat > ~/dev-workspace/bin/shop-hello << 'EOF'
#!/usr/bin/env bash
echo "shop-demo env OK; API_PORT=${API_PORT:-not set}"
EOF
chmod +x ~/dev-workspace/bin/shop-hello
步骤 2 — 此时直接运行(应失败)
shop-hello
你应该看到:command not found — 因为 ~/dev-workspace/bin 还不在 PATH。
步骤 3 — 临时加入 PATH(仅当前终端)
export PATH="$HOME/dev-workspace/bin:$PATH"
shop-hello