在 macOS 中用 Shell 变量区分环境的关键是可靠传递与合理使用:需 export 变量使子进程可见,通过 ~/.zshrc 设置并 source 生效;GUI 应用需用 launchctl 注入;脚本中应使用 ${ENVIRONMENT:-development} 防错。

在 macOS 中,用 Shell 变量区分生产与开发环境,核心是让不同环境下的命令、脚本或应用能自动感知当前所处模式,而不是硬编码路径或开关。关键不在于“定义变量”,而在于“可靠传递+合理使用”。
明确变量用途和作用范围
先想清楚这个变量要解决什么问题:
- 控制脚本行为:比如构建时是否压缩资源、是否启用调试日志
-
切换配置文件路径:如加载
config.dev.json还是config.prod.json -
影响工具链行为:例如
npm run dev自动设NODE_ENV=development
注意:Shell 变量默认只在当前 shell 有效;要传给子进程(比如你运行的 Python 脚本、Node.js 进程),必须用 export。
在 ~/.zshrc 中设置并导出环境变量
macOS Catalina 及以后默认使用 zsh,编辑 ~/.zshrc 是最常用且推荐的方式:
- 打开终端,运行:
nano ~/.zshrc - 在文件末尾添加(示例):
export ENVIRONMENT=development
或按需设为production - 保存退出(
Ctrl+O → Enter → Ctrl+X) - 立即生效:
source ~/.zshrc
这样所有新打开的终端、以及从中启动的命令行工具(如 node app.js)都能读到 $ENVIRONMENT。
让 GUI 应用也能读取(如 VS Code、IntelliJ)
图形界面应用通常不继承终端的环境变量。若你的开发工具或脚本需要在 GUI 环境下识别环境,需额外注入:
- 创建
~/Library/LaunchAgents/com.user.environment.plist - 内容示例(设
ENVIRONMENT为development):<?xml version="1.0" encoding="UTF-8"?><br><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><br><plist version="1.0"><br><dict><br> <key>Label</key><br> <string>com.user.environment</string><br> <key>ProgramArguments</key><br> <array><br> <string>sh</string><br> <string>-c</string><br> <string>launchctl setenv ENVIRONMENT development</string><br> </array><br> <key>RunAtLoad</key><br> <true/><br></dict><br></plist>
- 加载配置:
launchctl load ~/Library/LaunchAgents/com.user.environment.plist - 重启 GUI 应用(如 VS Code)即可读取
在脚本中安全读取和判断
别直接写 if [ $ENVIRONMENT = "production" ]——万一变量没设,会变成 if [ = "production" ] 报错。推荐写法:
- Bash/zsh 中:
if [[ "${ENVIRONMENT:-development}" == "production" ]]; then ... - Node.js 中:
process.env.ENVIRONMENT === 'production' - Python 中:
os.getenv('ENVIRONMENT', 'development') == 'production'
用 ${VAR:-default} 提供兜底值,避免因遗漏配置导致脚本中断。


















