作者在安装 gemini-cli 时,遇到了几个坑,在项目 issue 中查找解决方案的同时,借助 LLM,最终解决了问题。
本文绝大部分内容是 Qwen3-Max-Preview 生成的,主要目的是雁过留痕,以免自己遗忘,重蹈覆辙。仅供您参考。
为什么你需要读这篇文章?
你是否遇到过:
- 安装了
gemini-cli、vue、pnpm,但终端提示command not found? -
npm install或git clone龟速甚至失败,明明开了代理? - 想临时关闭代理,却不知道怎么操作?
- 修改了配置,重启终端又失效?
- 多个项目需要不同环境变量,手忙脚乱?
本文将从底层原理 → 核心文件 → 场景化配置 → 高级技巧,手把手带你建立一套可维护、可扩展、可切换的 Shell 环境配置体系。
一、Shell 环境配置底层原理
什么是“环境配置”?
Shell 环境配置 = 设置环境变量 + 别名 + 函数 + 路径,让系统和工具按你的意愿运行。
核心配置文件(macOS / Linux Bash)
| 文件 | 作用 | 是否推荐修改 |
|---|---|---|
~/.bash_profile |
登录 Shell 入口(macOS 终端默认加载) | 只写一行:source ~/.bashrc
|
~/.bashrc |
所有自定义配置集中地(PATH、代理、别名等) | 主战场 |
~/.profile |
通用登录脚本(兼容性) | 少用 |
/etc/profile |
系统级(影响所有用户) | 普通用户不要动 |
💡 最佳结构:
~/.bash_profile → source ~/.bashrc → 所有配置写在 ~/.bashrc
⚙️ 配置生效三要素
- 写入文件 → 持久化
- source 文件 → 立即生效
- 新开终端 → 自动加载
二、场景化配置实战
场景 1:修复 “command not found” —— 配置 PATH
适用:安装了
@google/gemini-cli、vue-cli、pnpm、vercel等全局 npm 包后无法执行
步骤:
-
查找 npm 全局 bin 路径:
npm config get prefix # 示例输出:/Users/yourname/.npm-global -
将 bin 目录加入 PATH(写入
~/.bashrc):echo 'export PATH="/Users/yourname/.npm-global/bin:$PATH"' >> ~/.bashrc -
确保
~/.bash_profile会加载它:grep -q "source ~/.bashrc" ~/.bash_profile || echo '[[ -f ~/.bashrc ]] && source ~/.bashrc' >> ~/.bash_profile -
重载配置:
source ~/.bash_profile -
验证:
which gemini gemini --version
✅ 搞定!以后所有全局 npm 命令都能直接用了。
场景 2:配置全局代理 —— 让 curl、git、npm 走代理
适用:访问 GitHub、npmjs、Google 等境外服务慢或失败
步骤:
-
确认你的代理地址(如 Clash 默认):
http://127.0.0.1:7890 socks5://127.0.0.1:7891 -
写入
~/.bashrc:cat >> ~/.bashrc <<EOF # =============== Proxy Configuration =============== export http_proxy="http://127.0.0.1:7890" export https_proxy="http://127.0.0.1:7890" export all_proxy="socks5://127.0.0.1:7891" export HTTP_PROXY="\$http_proxy" export HTTPS_PROXY="\$https_proxy" export ALL_PROXY="\$all_proxy" # =============================================== EOF -
重载:
source ~/.bash_profile -
验证:
echo $http_proxy curl -I https://www.google.com --connect-timeout 3
✅ 网络请求飞起来!
场景 3:为 npm / yarn / git 单独设置代理(可选增强)
有时系统代理不够,需要单独配置:
npm:
npm config set proxy http://127.0.0.1:7890
npm config set https-proxy http://127.0.0.1:7890
git:
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890
查看配置:
npm config list/git config --global --list
场景 4:临时关闭 / 开启代理(当前会话)
临时关闭:
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY all_proxy ALL_PROXY
临时开启:
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
export HTTP_PROXY=$http_proxy
export HTTPS_PROXY=$https_proxy
✅ 仅当前终端窗口有效,新开窗口恢复原配置
场景 5:永久关闭 / 切换代理
永久关闭:
编辑 ~/.bashrc:
nano ~/.bashrc
找到代理部分,注释掉:
# export http_proxy=...
# export https_proxy=...
保存 → 重载:
source ~/.bash_profile
切换代理端口:
直接修改 ~/.bashrc 中的端口号 → 保存 → source ~/.bash_profile
场景 6:高级玩法 —— 写个函数一键切换代理
在 ~/.bashrc 末尾添加:
# =============== Proxy Switcher ===============
proxy_on() {
local port=${1:-7890}
export http_proxy="http://127.0.0.1:$port"
export https_proxy="http://127.0.0.1:$port"
export HTTP_PROXY=$http_proxy
export HTTPS_PROXY=$https_proxy
echo "Proxy enabled on port $port"
}
proxy_off() {
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY all_proxy ALL_PROXY
echo "Proxy disabled"
}
alias pon='proxy_on'
alias poff='proxy_off'
# =============================================
然后:
source ~/.bash_profile
pon 7890 # 开启代理
poff # 关闭代理
pon 10809 # 切换到其他端口
🚀 效率拉满!
场景 7:仅对特定命令启用代理(精准控制)
使用 env 临时设置:
env http_proxy=http://127.0.0.1:7890 gemini chat "Hello"
或创建专属别名:
echo "alias gemini-proxy='http_proxy=http://127.0.0.1:7890 gemini'" >> ~/.bashrc
source ~/.bash_profile
这样:
-
gemini→ 不走代理 -
gemini-proxy→ 走代理
三、避坑指南 & 最佳实践
常见错误
| 问题 | 原因 | 解决 |
|---|---|---|
修改 .bashrc 没生效 |
macOS Bash 默认不加载它 | 在 .bash_profile 中加 source ~/.bashrc
|
| 命令找不到 | PATH 设置错误或未重载 |
echo $PATH 检查,source ~/.bash_profile 重载 |
| 代理不生效 | 代理未开 / 端口错 / 大小写不一致 |
curl -v https://google.com 测试,检查拼写 |
| 配置混乱 | 多处设置 PATH 或代理 | 统一写在 ~/.bashrc,避免重复 |
最佳实践
- 所有自定义配置写在
~/.bashrc ~/.bash_profile只保留source ~/.bashrc- 修改后一定执行
source ~/.bash_profile - 重要操作前备份:
cp ~/.bashrc ~/.bashrc.bak - 复杂逻辑封装成函数或别名
- 用
echo $VAR和curl验证是否生效
四、Shell 迁移指南(Bash → Zsh)
如果你打算切换到 Zsh(macOS 默认):
把
~/.bashrc内容复制到~/.zshrc删除或注释掉 bash 特有语法(如有)
-
执行:
chsh -s /bin/zsh 重启终端
💡 Zsh 更强大,支持插件、主题、自动补全等,推荐进阶使用
五、总结 & 脑图
Shell 环境配置体系
├── 核心目标:持久化、统一、灵活、安全
├── 核心文件:~/.bashrc ← ~/.bash_profile ← 终端
├── 场景配置:
│ ├── PATH → 解决 command not found
│ ├── 代理 → 加速网络请求
│ ├── 临时开关 → unset / export
│ ├── 永久开关 → 编辑文件 + source
│ ├── 切换配置 → 函数/别名
│ └── 命令级控制 → env
└── 最佳实践:
├── 集中管理 ~/.bashrc
├── 备份 + 验证
└── 函数化/别名化提升效率
附录:一键初始化脚本(可选)
创建 ~/.init-shell.sh:
#!/bin/bash
# 初始化 Shell 环境
echo "正在初始化 Shell 环境..."
# 创建 ~/.bashrc(如果不存在)
touch ~/.bashrc
# 设置 ~/.bash_profile 加载 ~/.bashrc
grep -q "source ~/.bashrc" ~/.bash_profile || echo '[[ -f ~/.bashrc ]] && source ~/.bashrc' >> ~/.bash_profile
# 添加 PATH 示例
grep -q "npm-global/bin" ~/.bashrc || echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.bashrc
# 添加代理切换函数
cat >> ~/.bashrc <<'EOF'
# Proxy Switcher
proxy_on() {
local port=${1:-7890}
export http_proxy="http://127.0.0.1:$port"
export https_proxy="http://127.0.0.1:$port"
export HTTP_PROXY=$http_proxy
export HTTPS_PROXY=$https_proxy
echo "✅ Proxy enabled on port $port"
}
proxy_off() {
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY
echo "🚫 Proxy disabled"
}
alias pon=proxy_on
alias poff=proxy_off
EOF
# 重载
source ~/.bash_profile
echo "Shell 环境初始化完成!"
echo "使用 pon 7890 开启代理,poff 关闭代理"
运行:
bash ~/.init-shell.sh
结语
Shell 环境配置不是玄学,而是一套可学习、可复用、可进阶的工程化能力。掌握它,你不仅能解决“命令找不到”“网络连不上”的日常烦恼,更能建立起属于自己的高效开发环境。
配置一次,受益终身。