环境变量和 Shell 配置是 Linux 系统的核心概念,特别是在深度学习开发中,正确配置 CUDA、Python、PATH 等环境变量至关重要。本文将全面讲解环境变量的使用和 Shell 配置文件的管理。

一、什么是环境变量?

1. 基本概念

环境变量(Environment Variable)是操作系统用来存储系统配置信息的一种机制。它们是键值对,告诉程序在哪里找到文件、如何运行等。

示例

PATH=/usr/local/bin:/usr/bin:/bin
HOME=/home/username
USER=username

2. 为什么需要环境变量?

  • 程序查找:告诉系统在哪里找可执行文件(PATH)
  • 配置信息:存储程序运行所需的配置(CUDA_VISIBLE_DEVICES)
  • 系统信息:存储用户、主目录等信息(USER, HOME)
  • 跨程序通信:让不同程序共享配置信息

3. 环境变量 vs 普通变量

# 普通变量(Shell 变量)- 只在当前 Shell 中有效
my_var="hello"

# 环境变量 - 可以被子进程继承
export MY_VAR="hello"

二、查看环境变量

1. 查看所有环境变量

# 方法 1:使用 env
env

# 方法 2:使用 printenv
printenv

# 方法 3:使用 export
export

# 方法 4:使用 set(包括 Shell 变量)
set

2. 查看特定环境变量

# 方法 1:使用 echo
echo $PATH
echo $HOME
echo $USER

# 方法 2:使用 printenv
printenv PATH
printenv HOME

# 方法 3:使用 env
env | grep PATH

实际示例

# 查看 PATH
echo $PATH
# 输出:/usr/local/bin:/usr/bin:/bin

# 查看用户主目录
echo $HOME
# 输出:/home/username

# 查看当前用户
echo $USER
# 输出:username

# 查看 Shell 类型
echo $SHELL
# 输出:/bin/bash 或 /bin/zsh

3. 检查变量是否存在

# 方法 1:使用 echo
echo $MY_VAR

# 方法 2:使用条件判断
if [ -z "$MY_VAR" ]; then
    echo "MY_VAR 不存在或为空"
else
    echo "MY_VAR 存在:$MY_VAR"
fi

# 方法 3:使用默认值
echo ${MY_VAR:-"默认值"}

三、设置环境变量

1. 临时设置(当前 Shell 有效)

# 设置普通变量
MY_VAR="hello"

# 设置环境变量(可被子进程继承)
export MY_VAR="hello"

# 或者一步完成
export MY_VAR="hello"

验证

# 设置变量
export TEST_VAR="test"

# 查看
echo $TEST_VAR

# 启动子 Shell
bash

# 在子 Shell 中查看(如果用 export,可以看到;否则看不到)
echo $TEST_VAR

2. 永久设置(写入配置文件)

在配置文件中添加 export 语句:

# 编辑配置文件
vim ~/.bashrc

# 添加环境变量
export MY_VAR="hello"
export PATH="$HOME/bin:$PATH"

# 使配置生效
source ~/.bashrc

3. 临时设置运行命令

# 只在这一条命令中设置环境变量
MY_VAR="hello" python script.py

# 设置多个环境变量
CUDA_VISIBLE_DEVICES=0,1 PYTHONPATH=/path python train.py

# 实际应用
CUDA_VISIBLE_DEVICES=0 python train.py --gpu 0

4. 删除环境变量

# 删除环境变量
unset MY_VAR

# 验证
echo $MY_VAR
# 输出为空

四、重要的系统环境变量

1. PATH - 可执行文件搜索路径

作用:告诉系统在哪些目录中查找可执行文件。

# 查看 PATH
echo $PATH
# 输出:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

# PATH 的格式:多个路径用冒号 : 分隔

添加新路径到 PATH

# 方法 1:添加到开头(优先级最高)
export PATH="/new/path:$PATH"

# 方法 2:添加到末尾(优先级最低)
export PATH="$PATH:/new/path"

# 方法 3:添加多个路径
export PATH="/path1:/path2:$PATH"

实际应用

# 添加自己的脚本目录
export PATH="$HOME/bin:$PATH"

# 添加 CUDA 路径
export PATH="/usr/local/cuda/bin:$PATH"

# 添加 Anaconda 路径
export PATH="$HOME/anaconda3/bin:$PATH"

# 添加 Node.js 路径
export PATH="$HOME/.nvm/versions/node/v16.0.0/bin:$PATH"

2. HOME - 用户主目录

echo $HOME
# 输出:/home/username

# 使用
cd $HOME
cd ~  # 等同于 cd $HOME

3. USER / USERNAME - 当前用户名

echo $USER
# 输出:username

# 使用
echo "当前用户是:$USER"

4. SHELL - 当前 Shell 类型

echo $SHELL
# 输出:/bin/bash 或 /bin/zsh

# 查看可用的 Shell
cat /etc/shells

5. PWD - 当前工作目录

echo $PWD
# 输出:/home/username/project

# 等同于 pwd 命令
pwd

6. LANG / LC_* - 语言和区域设置

# 查看当前语言设置
echo $LANG
# 输出:en_US.UTF-8 或 zh_CN.UTF-8

# 设置为中文
export LANG=zh_CN.UTF-8

# 设置为英文
export LANG=en_US.UTF-8

# 查看所有语言环境变量
locale

7. EDITOR - 默认编辑器

# 设置默认编辑器为 vim
export EDITOR=vim

# 设置为 nano
export EDITOR=nano

# 使用
crontab -e  # 会使用 $EDITOR 指定的编辑器

五、深度学习相关环境变量

1. CUDA_VISIBLE_DEVICES - 指定 GPU

最重要!最常用!

# 使用 GPU 0
export CUDA_VISIBLE_DEVICES=0

# 使用 GPU 0 和 1
export CUDA_VISIBLE_DEVICES=0,1

# 使用 GPU 1 和 3
export CUDA_VISIBLE_DEVICES=1,3

# 不使用 GPU(CPU 模式)
export CUDA_VISIBLE_DEVICES=""

# 或
export CUDA_VISIBLE_DEVICES=-1

临时使用

# 只在这次运行时使用 GPU 0
CUDA_VISIBLE_DEVICES=0 python train.py

# 使用 GPU 2 和 3
CUDA_VISIBLE_DEVICES=2,3 python train.py

# 在后台运行,使用 GPU 1
nohup CUDA_VISIBLE_DEVICES=1 python train.py > train.log 2>&1 &

注意事项

  • 设置后,PyTorch/TensorFlow 会重新编号 GPU
  • CUDA_VISIBLE_DEVICES=1,3 后,代码中的 GPU 0 对应物理 GPU 1,GPU 1 对应物理 GPU 3

2. PYTHONPATH - Python 模块搜索路径

# 添加自定义模块路径
export PYTHONPATH=/path/to/your/modules:$PYTHONPATH

# 添加当前目录
export PYTHONPATH=.:$PYTHONPATH

# 添加项目根目录
export PYTHONPATH=/home/user/project:$PYTHONPATH

# 添加多个路径
export PYTHONPATH=/path1:/path2:$PYTHONPATH

实际应用

# 项目结构
project/
├── src/
│   └── models.py
└── scripts/
    └── train.py

# 在 scripts/train.py 中导入 src/models.py
# 需要设置 PYTHONPATH
export PYTHONPATH=/home/user/project:$PYTHONPATH

# 然后就可以在 train.py 中
# from src.models import MyModel

3. LD_LIBRARY_PATH - 动态库搜索路径

# CUDA 库路径
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

# cuDNN 库路径
export LD_LIBRARY_PATH=/usr/local/cudnn/lib64:$LD_LIBRARY_PATH

# 自定义库路径
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

4. CUDA 相关环境变量

# CUDA 主目录
export CUDA_HOME=/usr/local/cuda

# CUDA 路径
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH

# cuDNN 路径(如果单独安装)
export CUDNN_HOME=/usr/local/cudnn
export LD_LIBRARY_PATH=$CUDNN_HOME/lib64:$LD_LIBRARY_PATH

5. TensorFlow 相关环境变量

# 设置日志级别(0=全部, 1=INFO, 2=WARNING, 3=ERROR)
export TF_CPP_MIN_LOG_LEVEL=2

# 禁用 GPU
export CUDA_VISIBLE_DEVICES=""

# 设置内存增长
export TF_FORCE_GPU_ALLOW_GROWTH=true

# 启用 XLA 优化
export TF_XLA_FLAGS=--tf_xla_enable_xla_devices

6. PyTorch 相关环境变量

# 设置线程数
export OMP_NUM_THREADS=4
export MKL_NUM_THREADS=4

# CUDA 相关
export CUDA_VISIBLE_DEVICES=0,1
export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512

# 调试模式
export PYTORCH_JIT_LOG_LEVEL=DEBUG

7. OpenCV 和其他库

# OpenCV 线程数
export OPENCV_NUM_THREADS=4

# NumPy 线程数
export OPENBLAS_NUM_THREADS=4
export MKL_NUM_THREADS=4

# HuggingFace 缓存目录
export TRANSFORMERS_CACHE=/path/to/cache
export HF_HOME=/path/to/cache

六、Shell 配置文件详解

1. 配置文件类型和加载顺序

Bash Shell 配置文件

系统级配置(所有用户):

  • /etc/profile - 登录时执行
  • /etc/bashrc/etc/bash.bashrc - 每次启动 Shell 时执行

用户级配置(当前用户):

  • ~/.bash_profile - 登录时执行(优先)
  • ~/.bash_login - 登录时执行(次优先)
  • ~/.profile - 登录时执行(最后)
  • ~/.bashrc - 每次启动 Shell 时执行(最常用!)
  • ~/.bash_logout - 退出登录时执行
Zsh Shell 配置文件
  • /etc/zshenv - 总是执行
  • ~/.zshenv - 总是执行
  • ~/.zprofile - 登录时执行
  • ~/.zshrc - 交互式 Shell 时执行(最常用!)
  • ~/.zlogin - 登录时执行
  • ~/.zlogout - 退出时执行

2. 配置文件的区别

~/.bashrc vs ~/.bash_profile

~/.bash_profile

  • 登录 Shell 时执行(如 SSH 登录)
  • 只执行一次
  • 通常会调用 ~/.bashrc

~/.bashrc

  • 交互式非登录 Shell 时执行(如打开新终端)
  • 每次打开新 Shell 都执行
  • 最常用!推荐在这里配置环境变量

标准配置: 在 ~/.bash_profile 中调用 ~/.bashrc

# ~/.bash_profile
if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi

3. 查看当前使用的 Shell

# 方法 1
echo $SHELL

# 方法 2
echo $0

# 方法 3
ps -p $$

4. 配置文件加载顺序图

登录 Shell(SSH 登录)

/etc/profile
    ↓
~/.bash_profile (或 ~/.bash_login 或 ~/.profile)
    ↓
~/.bashrc (如果被调用)
    ↓
/etc/bashrc (如果被调用)

非登录 Shell(打开新终端)

~/.bashrc
    ↓
/etc/bashrc (如果被调用)

七、配置文件实战

1. 基本的 ~/.bashrc 配置

# ~/.bashrc

# ============ 系统配置 ============
# 如果不是交互式 Shell,直接返回
[[ $- != *i* ]] && return

# 历史记录设置
HISTSIZE=10000
HISTFILESIZE=20000
HISTCONTROL=ignoredups:erasedups

# 启用颜色支持
export CLICOLOR=1
export LSCOLORS=GxFxCxDxBxegedabagaced

# ============ 别名 ============
alias ll='ls -lh'
alias la='ls -lah'
alias ..='cd ..'
alias ...='cd ../..'
alias grep='grep --color=auto'

# ============ 环境变量 ============
# 编辑器
export EDITOR=vim

# 语言
export LANG=en_US.UTF-8

# ============ PATH ============
# 添加自己的 bin 目录
export PATH="$HOME/bin:$PATH"

# ============ 提示符 ============
# 自定义命令提示符
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

# ============ 加载其他配置 ============
# 如果有其他配置文件,在这里加载
if [ -f ~/.bash_aliases ]; then
    source ~/.bash_aliases
fi

2. 深度学习环境配置示例

# ~/.bashrc - 深度学习环境配置

# ============ Anaconda ============
# 初始化 Conda(通常 Anaconda 安装时会自动添加)
__conda_setup="$('/home/user/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/home/user/anaconda3/etc/profile.d/conda.sh" ]; then
        . "/home/user/anaconda3/etc/profile.d/conda.sh"
    else
        export PATH="/home/user/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup

# ============ CUDA ============
export CUDA_HOME=/usr/local/cuda
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH

# cuDNN
export CUDNN_HOME=/usr/local/cudnn
export LD_LIBRARY_PATH=$CUDNN_HOME/lib64:$LD_LIBRARY_PATH

# ============ Python ============
# PYTHONPATH
export PYTHONPATH="$HOME/projects:$PYTHONPATH"

# ============ 深度学习别名 ============
# GPU 状态
alias gpu='nvidia-smi'
alias gpu-watch='watch -n 1 nvidia-smi'

# 训练相关
alias train='CUDA_VISIBLE_DEVICES=0 python train.py'
alias tensorboard='tensorboard --logdir=logs'

# 环境管理
alias py38='conda activate py38'
alias pytorch='conda activate pytorch'

# ============ 项目相关 ============
# 快速进入项目目录
export PROJECT_HOME="$HOME/projects"
alias proj='cd $PROJECT_HOME'
alias dl='cd $PROJECT_HOME/deep-learning'

# ============ 常用函数 ============
# 快速激活 conda 环境并进入项目
work() {
    conda activate $1
    cd $PROJECT_HOME/$1
}

# 查看 GPU 使用情况
gpu-status() {
    nvidia-smi --query-gpu=index,name,temperature.gpu,utilization.gpu,memory.used,memory.total --format=csv
}

# 一键设置 GPU
use-gpu() {
    export CUDA_VISIBLE_DEVICES=$1
    echo "使用 GPU: $1"
}

3. 模块化配置(推荐!)

将配置分散到多个文件中:

主配置文件 ~/.bashrc

# ~/.bashrc

# 基础配置
if [ -f ~/.bash/basic.sh ]; then
    source ~/.bash/basic.sh
fi

# 别名
if [ -f ~/.bash/aliases.sh ]; then
    source ~/.bash/aliases.sh
fi

# 环境变量
if [ -f ~/.bash/env.sh ]; then
    source ~/.bash/env.sh
fi

# 函数
if [ -f ~/.bash/functions.sh ]; then
    source ~/.bash/functions.sh
fi

# 深度学习环境
if [ -f ~/.bash/deeplearning.sh ]; then
    source ~/.bash/deeplearning.sh
fi

~/.bash/basic.sh

# 基础系统配置
export EDITOR=vim
export LANG=en_US.UTF-8
HISTSIZE=10000
HISTFILESIZE=20000

~/.bash/aliases.sh

# 别名
alias ll='ls -lh'
alias la='ls -lah'
alias ..='cd ..'
alias grep='grep --color=auto'

~/.bash/env.sh

# 环境变量
export PATH="$HOME/bin:$PATH"
export PROJECT_HOME="$HOME/projects"

~/.bash/deeplearning.sh

# 深度学习环境
export CUDA_HOME=/usr/local/cuda
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH

# Anaconda
export PATH="$HOME/anaconda3/bin:$PATH"

4. 使配置生效

# 方法 1:重新加载配置文件
source ~/.bashrc

# 方法 2:使用点命令(等同于 source)
. ~/.bashrc

# 方法 3:重新登录或打开新终端

八、Conda 虚拟环境管理

1. 什么是虚拟环境?

虚拟环境允许你为不同项目创建独立的 Python 环境,避免包冲突。

2. Conda 基本命令

# 创建新环境
conda create -n env_name python=3.8

# 创建环境并安装包
conda create -n pytorch_env python=3.8 pytorch torchvision -c pytorch

# 激活环境
conda activate env_name

# 退出环境
conda deactivate

# 列出所有环境
conda env list
# 或
conda info --envs

# 删除环境
conda remove -n env_name --all

# 导出环境
conda env export > environment.yml

# 从文件创建环境
conda env create -f environment.yml

# 查看当前环境的包
conda list

# 安装包
conda install package_name

# 更新包
conda update package_name

# 删除包
conda remove package_name

3. 自动激活环境

~/.bashrc 中添加:

# 启动时自动激活默认环境
conda activate base

# 或者进入特定目录时自动激活
cd() {
    builtin cd "$@"
    if [ -f .conda_env ]; then
        ENV_NAME=$(cat .conda_env)
        conda activate $ENV_NAME
        echo "已激活环境: $ENV_NAME"
    fi
}

然后在项目目录创建 .conda_env 文件:

echo "pytorch_env" > /path/to/project/.conda_env

4. requirements.txt vs environment.yml

requirements.txt(pip)

numpy==1.21.0
torch==1.9.0
torchvision==0.10.0

安装:

pip install -r requirements.txt

environment.yml(conda)

name: my_env
channels:
  - pytorch
  - conda-forge
  - defaults
dependencies:
  - python=3.8
  - pytorch=1.9.0
  - torchvision=0.10.0
  - numpy=1.21.0
  - pip:
    - tensorboard==2.6.0

安装:

conda env create -f environment.yml

5. 实用技巧

# 快速切换环境的别名
alias py38='conda activate python38'
alias torch='conda activate pytorch'
alias tf='conda activate tensorflow'

# 查看环境信息的函数
conda-info() {
    echo "当前环境: $CONDA_DEFAULT_ENV"
    echo "Python 版本: $(python --version)"
    echo "位置: $(which python)"
    echo "已安装包数量: $(pip list | wc -l)"
}

# 清理 conda 缓存
conda clean --all

# 在当前目录创建环境
conda create --prefix ./env python=3.8
conda activate ./env

九、实用技巧和最佳实践

1. 环境变量调试

# 查看某个程序使用的环境变量
env | grep CUDA
env | grep PYTHON

# 在脚本开头打印环境变量
echo "CUDA_VISIBLE_DEVICES: $CUDA_VISIBLE_DEVICES"
echo "PYTHONPATH: $PYTHONPATH"
echo "PATH: $PATH"

# 查看命令实际位置
which python
which nvidia-smi

# 查看库加载路径
ldd /path/to/executable

2. 临时环境变量的作用域

# 方式 1:只影响一条命令
CUDA_VISIBLE_DEVICES=0 python train.py

# 方式 2:影响当前 Shell
export CUDA_VISIBLE_DEVICES=0
python train.py

# 方式 3:在子 Shell 中设置
(export CUDA_VISIBLE_DEVICES=0; python train.py)
# 退出子 Shell 后,环境变量恢复

3. 配置文件备份

# 备份配置文件
cp ~/.bashrc ~/.bashrc.backup_$(date +%Y%m%d)

# 或创建版本控制
mkdir -p ~/dotfiles
cp ~/.bashrc ~/dotfiles/bashrc
cd ~/dotfiles
git init
git add bashrc
git commit -m "Initial bashrc"

# 创建符号链接
ln -s ~/dotfiles/bashrc ~/.bashrc

4. 快速编辑配置文件

# 添加到 ~/.bashrc
alias edit-bashrc='vim ~/.bashrc && source ~/.bashrc'
alias reload-bashrc='source ~/.bashrc && echo "配置已重新加载"'

# 使用
edit-bashrc  # 编辑并自动重新加载
reload-bashrc  # 只重新加载

5. 条件配置

# 根据主机名设置不同配置
if [ "$HOSTNAME" = "gpu-server" ]; then
    export CUDA_VISIBLE_DEVICES=0,1
    alias train='python train.py --gpu 2'
elif [ "$HOSTNAME" = "cpu-server" ]; then
    export CUDA_VISIBLE_DEVICES=""
    alias train='python train.py --no-gpu'
fi

# 根据操作系统设置
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
    alias ls='ls --color=auto'
elif [[ "$OSTYPE" == "darwin"* ]]; then
    alias ls='ls -G'
fi

6. 环境变量优先级

# 优先级从高到低:
# 1. 命令行直接设置
CUDA_VISIBLE_DEVICES=0 python train.py

# 2. export 设置
export CUDA_VISIBLE_DEVICES=1

# 3. ~/.bashrc 中设置
# 在 ~/.bashrc 中:export CUDA_VISIBLE_DEVICES=2

# 4. 系统默认值

十、常见问题和解决方案

1. 配置不生效

问题:修改 ~/.bashrc 后没有效果

解决

# 方法 1:重新加载
source ~/.bashrc

# 方法 2:检查是否在正确的文件中
echo $SHELL  # 确认使用的 Shell

# 如果是 zsh,应该编辑 ~/.zshrc
vim ~/.zshrc
source ~/.zshrc

# 方法 3:检查语法错误
bash -n ~/.bashrc  # 检查语法

2. PATH 设置错误

问题:命令找不到

解决

# 检查 PATH
echo $PATH

# 临时添加路径测试
export PATH="/new/path:$PATH"

# 查找命令位置
which python
type python

# 恢复 PATH
export PATH="/usr/local/bin:/usr/bin:/bin"

3. CUDA 找不到

问题:CUDA library not found

解决

# 检查 CUDA 是否安装
ls /usr/local/cuda

# 检查环境变量
echo $CUDA_HOME
echo $LD_LIBRARY_PATH

# 设置环境变量
export CUDA_HOME=/usr/local/cuda
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH

# 验证
nvcc --version

4. Conda 环境冲突

问题:包版本冲突

解决

# 创建新环境
conda create -n clean_env python=3.8

# 激活并安装
conda activate clean_env
conda install pytorch torchvision -c pytorch

# 或使用 pip
pip install torch torchvision

# 导出正确的环境
conda env export > working_environment.yml

5. 环境变量被覆盖

问题:设置的环境变量被后续配置覆盖

解决

# 检查配置文件加载顺序
# 在 ~/.bashrc 末尾添加
echo "Loaded ~/.bashrc"

# 在 ~/.bash_profile 末尾添加
echo "Loaded ~/.bash_profile"

# 找到冲突的地方,调整顺序


更多推荐