环境变量与 Shell 配置指南
适用场景:配置 PATH、管理 .env 文件、自定义 shell(alias/prompt)、理解配置文件加载顺序。
适用版本:Bash/Zsh、PowerShell 7+;Node.js 原生
.env示例要求 Node.js 20.6+。最后核对:2026-07-30
30 秒快速路径
printenv PATH
export NODE_ENV=development
node --env-file=.env app.js
目录
核心概念
环境变量是进程环境中的键值对。子进程通常继承父进程创建时的环境,但其他已运行进程不会自动看到修改,也不代表“所有程序都能读取”。它适合传递配置,但敏感值仍需要权限控制和专门的密钥管理。
变量名=值
NODE_ENV=production
DATABASE_URL=postgres://localhost:5432/mydb
PATH=/usr/bin:/usr/local/bin
作用域
| 作用域 | 生命周期 | 设置方式 |
|---|---|---|
| 当前命令(Bash/Zsh) | 这一条命令及其子进程 | VAR=val command |
| 当前会话 | 终端关闭前 | export VAR=val |
| 持久化 | 每次新终端都有 | 写入配置文件 |
| 系统级 | 所有用户 | 系统设置/etc/environment |
环境变量基础
Linux / macOS / Git Bash
# 查看所有环境变量
env
printenv
# 查看某个变量
echo $HOME
echo $NODE_ENV
printenv NODE_ENV
# 设置(当前会话有效)
export NODE_ENV=production
export API_KEY="abc123"
# 仅对单条命令生效
NODE_ENV=production npm run build
PORT=3000 node server.js
# 删除
unset NODE_ENV
PowerShell
# 查看所有
Get-ChildItem Env:
dir Env:
# 查看某个
$env:HOME
$env:NODE_ENV
echo $env:PATH
# 设置(当前会话)
$env:NODE_ENV = "production"
$env:API_KEY = "abc123"
# 仅对子进程命令生效,不污染当前 PowerShell 会话
cmd.exe /d /s /c "set NODE_ENV=production&& npm run build"
# 删除
Remove-Item Env:NODE_ENV
# 永久设置(用户级)
[Environment]::SetEnvironmentVariable("NODE_ENV", "production", "User")
# 只影响之后启动的进程;当前会话如需使用仍要设置 $env:NODE_ENV
# 永久删除
[Environment]::SetEnvironmentVariable("NODE_ENV", $null, "User")
PATH 变量
PATH 告诉系统去哪些目录里找可执行文件。输入命令时按 PATH 中的顺序逐个目录查找。
查看 PATH
# Linux/macOS
echo $PATH # 冒号分隔的路径列表
echo $PATH | tr ':' '\n' # 每行一个路径,更清晰
# PowerShell
$env:PATH -split ';' # 分号分隔(Windows)
添加到 PATH
# Linux/macOS — 临时
export PATH="$HOME/.local/bin:$PATH" # 加到前面(优先级高)
export PATH="$PATH:/opt/new-tool/bin" # 加到后面
# 持久化:避免每次执行都重复追加同一行
grep -qxF 'export PATH="$HOME/.local/bin:$PATH"' ~/.bashrc ||
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc # 立即生效
# PowerShell — 临时
$env:PATH = "C:\new-tool\bin;$env:PATH"
# 持久化(用户级;只影响之后启动的进程)
$current = [Environment]::GetEnvironmentVariable("PATH", "User")
$newEntry = "C:\new-tool\bin"
$entries = @($current -split ';' | Where-Object { $_ })
if ($entries -notcontains $newEntry) {
[Environment]::SetEnvironmentVariable("PATH", "$newEntry;$current", "User")
}
常见需要加 PATH 的情况
| 场景 | 需要添加的路径 |
|---|---|
| npm 全局包 | ~/.npm-global/bin |
| pnpm 全局 | ~/.local/share/pnpm |
| Rust/cargo | ~/.cargo/bin |
| Go | ~/go/bin |
| Python pip | ~/.local/bin |
| 自定义脚本 | ~/bin 或 ~/.local/bin |
.env 文件
格式
# .env 文件格式
NODE_ENV=development
PORT=4321
DATABASE_URL=postgres://USER:PASSWORD@localhost:5432/db
API_KEY=replace-with-local-secret
# 可以用引号(包含空格时必须)
APP_NAME="My Cool App"
# 注释用 #
# SECRET_KEY=不要提交到 git!
使用方式
# Node.js 20.6+:无需安装依赖
node --env-file=.env app.js
# 文件可选,不存在时不报错(Node.js 22.9+)
node --env-file-if-exists=.env.local app.js
// Node.js 22.21+ / 24.10+:也可在程序中加载
import { loadEnvFile } from 'node:process';
loadEnvFile('.env');
console.log(process.env.API_KEY);
旧版 Node.js 或需要兼容特殊加载规则时,再使用 dotenv:
npm install dotenv
import 'dotenv/config';
// CommonJS: require('dotenv').config();
console.log(process.env.API_KEY);
Vite、Astro、Next.js 等框架自带 .env 加载机制,通常不需要手动调用 dotenv。常见文件名包括 .env、.env.local、.env.development 和 .env.production,但加载优先级应以对应框架版本文档为准。
客户端代码中的环境变量会进入浏览器产物,不能包含秘密。常见公开前缀分别是 Vite 的 VITE_、Astro 的 PUBLIC_、Next.js 的 NEXT_PUBLIC_;具体加载顺序和服务器端行为要以所用框架版本文档为准。NODE_ENV 通常由构建工具决定,不要把它当作普通业务配置随意覆盖。
安全规则
# 默认忽略所有本地环境文件
.env*
# 提供一个示例文件
# .env.example(提交到 git,不含真实值)
!.env.example
NODE_ENV=development
PORT=4321
DATABASE_URL=
API_KEY=
Shell 配置文件
加载顺序
Bash:
登录 shell: /etc/profile,然后只读取以下第一个存在的文件:
~/.bash_profile、~/.bash_login、~/.profile
交互式非登录 shell: ~/.bashrc
常见做法是在 ~/.bash_profile 中显式 source ~/.bashrc;
这不是 Bash 自动完成的。
Zsh:
所有 zsh: ~/.zshenv
登录 shell: ~/.zprofile,之后读取 ~/.zlogin;退出时读取 ~/.zlogout
交互式 shell: ~/.zshrc
交互配置通常写入 ~/.zshrc;不要把产生输出或依赖终端的命令写进 ~/.zshenv。
PowerShell:
$PROFILE → 通常是 ~/Documents/PowerShell/Microsoft.PowerShell_profile.ps1
配置文件内容示例
# ~/.bashrc 或 ~/.zshrc
# ── PATH ──
export PATH="$HOME/.local/bin:$HOME/.npm-global/bin:$PATH"
# ── 环境变量 ──
export EDITOR="code --wait"
export LANG="en_US.UTF-8"
export NODE_OPTIONS="--max-old-space-size=4096"
# ── Alias ──
alias ll="ls -la"
alias g="git"
alias dev="npm run dev"
# ── 函数 ──
mkcd() { mkdir -p "$1" && cd "$1"; }
# ── 加载工具 ──
eval "$(fnm env)" # fnm (Node 版本管理)
eval "$(starship init bash)" # Starship prompt
Alias — 命令别名
Bash / Zsh
# 临时(当前会话)
alias ll="ls -la"
alias gs="git status"
alias dev="npm run dev"
# 持久化:写入 ~/.bashrc 或 ~/.zshrc
echo 'alias ll="ls -la"' >> ~/.zshrc
source ~/.zshrc
# 查看所有别名
alias
# 删除别名
unalias ll
# 带参数的"别名"用函数;不要把 add/commit/push 无检查地绑成一步
gcommit() {
git status --short
git diff --cached
git commit -m "$1"
}
# 使用前先显式 git add,再执行:gcommit "feat: add login"
PowerShell
# 临时
Set-Alias -Name g -Value git
function dev { npm run dev }
function gs { git status }
# 持久化:写入 $PROFILE
notepad $PROFILE # 打开配置文件
# 加入:
# Set-Alias -Name g -Value git
# function dev { npm run dev }
# 查看
Get-Alias
推荐别名(前端开发)
# Git
alias gs="git status"
alias ga="git add"
alias gc="git commit -m"
alias gp="git push"
alias gl="git log --oneline -10"
alias gd="git diff"
alias gco="git checkout"
alias gb="git branch"
# npm
alias ni="npm install"
alias nr="npm run"
alias dev="npm run dev"
alias build="npm run build"
# 目录
alias ..="cd .."
alias ...="cd ../.."
alias ll="ls -la"
alias projects="cd ~/projects"
Prompt 自定义
Starship(推荐,跨平台)
# 安装
# Windows: winget install starship
# macOS: brew install starship
# Linux:优先使用可信的软件包管理器;使用官方脚本时先下载并检查
curl -fsSLo /tmp/install-starship.sh https://starship.rs/install.sh
less /tmp/install-starship.sh
sh /tmp/install-starship.sh
# 激活(加到 shell 配置文件末尾)
eval "$(starship init bash)" # ~/.bashrc
eval "$(starship init zsh)" # ~/.zshrc
# 配置:~/.config/starship.toml
# 自动显示:git 分支、Node 版本、包版本、执行时间等
# PowerShell $PROFILE;只对已确认来源的 starship 可执行文件运行其生成代码
Invoke-Expression (&starship init powershell)
手动自定义 PS1(Bash)
# 简洁风格:用户@目录 $
export PS1="\u@\w \$ "
# 带 git 分支:
parse_git_branch() { git branch 2>/dev/null | grep '*' | sed 's/* //'; }
export PS1="\w (\$(parse_git_branch)) \$ "
# 带颜色:
export PS1="\[\033[36m\]\w\[\033[33m\] (\$(parse_git_branch))\[\033[0m\] \$ "
PowerShell Profile
# 查看 Profile 路径
echo $PROFILE
# 通常:C:\Users\你\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
# 创建/编辑:不同宿主的 $PROFILE 路径可能不同,以当前变量值为准
$profileDir = Split-Path -Parent $PROFILE
New-Item -ItemType Directory -Path $profileDir -Force | Out-Null
if (!(Test-Path -LiteralPath $PROFILE)) {
New-Item -ItemType File -Path $PROFILE | Out-Null
}
notepad $PROFILE
# ═══ Profile 内容示例 ═══
# 别名
Set-Alias -Name g -Value git
Set-Alias -Name which -Value Get-Command
# 函数
function dev { npm run dev }
function build { npm run build }
function mkcd($dir) {
New-Item -ItemType Directory -Path $dir -Force | Out-Null
Set-Location -LiteralPath $dir
}
function ports { Get-NetTCPConnection -State Listen | Sort LocalPort | Format-Table -Auto }
# Starship prompt
# 仅执行来自已确认 starship 可执行文件的初始化代码
Invoke-Expression (&starship init powershell)
# 输出欢迎信息
Write-Host "PowerShell ready." -ForegroundColor Cyan
三平台对照表
| 操作 | Bash / Zsh | PowerShell | Git Bash |
|---|---|---|---|
| 查看变量 | echo $VAR |
$env:VAR |
echo $VAR |
| 设置变量 | export VAR=val |
$env:VAR = "val" |
export VAR=val |
| 仅对子命令生效 | VAR=val command |
cmd /d /s /c "set VAR=val&& command" |
VAR=val command |
| 查看 PATH | echo $PATH |
$env:PATH -split ';' |
echo $PATH |
| 加 PATH | export PATH="新:$PATH" |
$env:PATH = "新;$env:PATH" |
同 Bash |
| 配置文件 | ~/.bashrc / ~/.zshrc |
$PROFILE |
~/.bashrc |
| 设别名 | alias name="cmd" |
Set-Alias name cmd |
alias name="cmd" |
| 生效配置 | source ~/.bashrc |
. $PROFILE |
source ~/.bashrc |