Linux 环境变量和 Shell 配置完全指南
·
环境变量和 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"
# 找到冲突的地方,调整顺序
更多推荐


所有评论(0)