运行环境

12 分钟阅读 · 23 组命令示例

环境变量与 Shell 配置指南

适用场景:配置 PATH、管理 .env 文件、自定义 shell(alias/prompt)、理解配置文件加载顺序。

适用版本:Bash/Zsh、PowerShell 7+;Node.js 原生 .env 示例要求 Node.js 20.6+。

最后核对:2026-07-30

30 秒快速路径

bash
printenv PATH
export NODE_ENV=development
node --env-file=.env app.js

目录

  1. 核心概念
  2. 环境变量基础
  3. PATH 变量
  4. .env 文件
  5. Shell 配置文件
  6. Alias — 命令别名
  7. Prompt 自定义
  8. PowerShell Profile
  9. 三平台对照表

核心概念

环境变量是进程环境中的键值对。子进程通常继承父进程创建时的环境,但其他已运行进程不会自动看到修改,也不代表“所有程序都能读取”。它适合传递配置,但敏感值仍需要权限控制和专门的密钥管理。

text
变量名=值
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

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

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

bash
# Linux/macOS
echo $PATH                     # 冒号分隔的路径列表
echo $PATH | tr ':' '\n'       # 每行一个路径,更清晰

# PowerShell
$env:PATH -split ';'           # 分号分隔(Windows)

添加到 PATH

bash
# 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
# 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
# .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!

使用方式

bash
# Node.js 20.6+:无需安装依赖
node --env-file=.env app.js

# 文件可选,不存在时不报错(Node.js 22.9+)
node --env-file-if-exists=.env.local app.js
js
// Node.js 22.21+ / 24.10+:也可在程序中加载
import { loadEnvFile } from 'node:process';
loadEnvFile('.env');

console.log(process.env.API_KEY);

旧版 Node.js 或需要兼容特殊加载规则时,再使用 dotenv

bash
npm install dotenv
js
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 通常由构建工具决定,不要把它当作普通业务配置随意覆盖。

安全规则

gitignore
# 默认忽略所有本地环境文件
.env*

# 提供一个示例文件
# .env.example(提交到 git,不含真实值)
!.env.example
NODE_ENV=development
PORT=4321
DATABASE_URL=
API_KEY=

Shell 配置文件

加载顺序

Bash:

text
登录 shell: /etc/profile,然后只读取以下第一个存在的文件:
            ~/.bash_profile、~/.bash_login、~/.profile
交互式非登录 shell: ~/.bashrc

常见做法是在 ~/.bash_profile 中显式 source ~/.bashrc;
这不是 Bash 自动完成的。

Zsh:

text
所有 zsh:        ~/.zshenv
登录 shell:      ~/.zprofile,之后读取 ~/.zlogin;退出时读取 ~/.zlogout
交互式 shell:    ~/.zshrc

交互配置通常写入 ~/.zshrc;不要把产生输出或依赖终端的命令写进 ~/.zshenv。

PowerShell:

text
$PROFILE  →  通常是 ~/Documents/PowerShell/Microsoft.PowerShell_profile.ps1

配置文件内容示例

bash
# ~/.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

bash
# 临时(当前会话)
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

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

推荐别名(前端开发)

bash
# 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(推荐,跨平台)

bash
# 安装
# 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
# PowerShell $PROFILE;只对已确认来源的 starship 可执行文件运行其生成代码
Invoke-Expression (&starship init powershell)

手动自定义 PS1(Bash)

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

powershell
# 查看 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

官方参考