Linux教程 / 第 140 节

第14章:环境变量与软件管理

掌握环境配置和软件安装,打造高效开发环境

本章目标

  • 理解环境变量的作用和配置方法
  • 掌握PATH变量的管理
  • 学会使用包管理器安装软件
  • 能够编译安装源码软件
  • 了解版本管理工具的使用

14.1 环境变量基础

14.1.1 什么是环境变量

环境变量是操作系统用来存储配置信息的键值对,影响程序的运行行为。

常见环境变量:

  • PATH: 可执行文件搜索路径
  • HOME: 用户主目录
  • USER: 当前用户名
  • SHELL: 当前Shell
  • LANG: 语言设置
  • PWD: 当前工作目录
  • EDITOR: 默认文本编辑器

14.1.2 查看环境变量

# 查看所有环境变量
env
# 或
printenv

# 查看特定环境变量
echo $PATH
echo $HOME
echo $USER

# 查看变量详细信息
printenv PATH
env | grep PATH

# 列出所有变量(包括Shell变量)
set

示例输出:

echo $PATH
# /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

echo $HOME
# /home/username

echo $SHELL
# /bin/bash

14.2 设置环境变量

14.2.1 临时设置(当前会话)

# 设置变量
export MY_VAR="Hello World"

# 查看变量
echo $MY_VAR
# Hello World

# 添加到PATH
export PATH=$PATH:/new/path

# 验证
echo $PATH

⚠️ 注意: 临时设置在关闭终端后失效

14.2.2 永久设置(用户级别)

编辑 ~/.bashrc (Bash):

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

# 添加以下内容:
export MY_VAR="Hello World"
export PATH=$PATH:$HOME/bin
export EDITOR=vim

# 保存后重新加载
source ~/.bashrc
# 或
. ~/.bashrc

编辑 ~/.bash_profile~/.profile:

# ~/.bash_profile 在登录时执行
# ~/.bashrc 在每次打开新终端时执行

# 通常在 ~/.bash_profile 中加载 ~/.bashrc
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

Zsh用户:

# 编辑 ~/.zshrc
nano ~/.zshrc

# 添加环境变量
export MY_VAR="value"

# 重新加载
source ~/.zshrc

14.2.3 永久设置(系统级别)

# 编辑系统环境变量(需要root权限)
sudo nano /etc/environment

# 添加:
MY_VAR="value"
PATH="/usr/local/bin:/usr/bin:/bin"

# 或编辑 /etc/profile
sudo nano /etc/profile

# 添加:
export MY_VAR="value"

# 重启或重新登录生效

14.3 PATH变量管理

14.3.1 理解PATH

PATH是最重要的环境变量,定义了Shell查找可执行文件的目录列表。

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

# PATH由多个目录组成,用冒号分隔
# Shell按顺序搜索这些目录

14.3.2 添加到PATH

# 临时添加(当前会话)
export PATH=$PATH:/new/directory

# 添加到开头(优先级更高)
export PATH=/new/directory:$PATH

# 永久添加(编辑 ~/.bashrc)
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc
source ~/.bashrc

实战场景: 添加自定义脚本目录

# 1. 创建个人bin目录
mkdir -p ~/bin

# 2. 添加到PATH
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc
source ~/.bashrc

# 3. 创建脚本
cat > ~/bin/hello.sh <<'EOF'
#!/bin/bash
echo "Hello from custom script!"
EOF

# 4. 添加执行权限
chmod +x ~/bin/hello.sh

# 5. 直接运行(无需指定路径)
hello.sh
# Hello from custom script!

14.3.3 which命令 - 查找可执行文件

# 查找命令的完整路径
which python
# /usr/bin/python

which node
# /usr/local/bin/node

# 查找所有匹配的路径
which -a python

# 查看命令类型
type python
# python is /usr/bin/python

type cd
# cd is a shell builtin

14.4 包管理器

14.4.1 apt (Ubuntu/Debian)

基本操作:

# 更新包列表
sudo apt update

# 升级所有包
sudo apt upgrade

# 升级系统(包括内核)
sudo apt full-upgrade

# 搜索包
apt search package-name

# 查看包信息
apt show package-name

# 安装包
sudo apt install package-name

# 安装多个包
sudo apt install package1 package2 package3

# 安装指定版本
sudo apt install package-name=version

# 卸载包(保留配置)
sudo apt remove package-name

# 完全卸载(删除配置)
sudo apt purge package-name

# 删除不需要的依赖
sudo apt autoremove

# 清理下载的包文件
sudo apt clean

实战示例:

# 安装开发工具
sudo apt update
sudo apt install -y build-essential git curl wget vim

# 安装Node.js
sudo apt install -y nodejs npm

# 安装Python开发环境
sudo apt install -y python3 python3-pip python3-venv

# 安装数据库
sudo apt install -y mysql-server postgresql

# 查看已安装的包
apt list --installed

# 查看可升级的包
apt list --upgradable

14.4.2 yum/dnf (CentOS/RHEL/Fedora)

# CentOS 7及以下使用yum
# CentOS 8+和Fedora使用dnf

# 更新包列表
sudo yum update
# 或
sudo dnf update

# 搜索包
yum search package-name
dnf search package-name

# 查看包信息
yum info package-name
dnf info package-name

# 安装包
sudo yum install package-name
sudo dnf install package-name

# 卸载包
sudo yum remove package-name
sudo dnf remove package-name

# 列出已安装的包
yum list installed
dnf list installed

# 清理缓存
sudo yum clean all
sudo dnf clean all

14.4.3 snap (跨发行版)

# 安装snap
sudo apt install snapd  # Ubuntu
sudo dnf install snapd  # Fedora

# 搜索snap包
snap find package-name

# 安装snap包
sudo snap install package-name

# 列出已安装的snap
snap list

# 更新snap包
sudo snap refresh package-name

# 更新所有snap
sudo snap refresh

# 卸载snap包
sudo snap remove package-name

# 常用snap应用
sudo snap install code --classic  # VS Code
sudo snap install postman
sudo snap install docker

14.5 编译安装源码

14.5.1 安装编译工具

# Ubuntu/Debian
sudo apt install build-essential

# CentOS/RHEL
sudo yum groupinstall "Development Tools"

# 验证
gcc --version
make --version

14.5.2 典型编译流程

# 1. 下载源码
wget https://example.com/software-1.0.tar.gz

# 2. 解压
tar -xzf software-1.0.tar.gz
cd software-1.0

# 3. 配置(检查依赖,设置安装路径)
./configure --prefix=/usr/local

# 常用configure选项:
# --prefix=/path        安装路径
# --enable-feature      启用特性
# --disable-feature     禁用特性
# --with-library        使用指定库

# 4. 编译
make

# 并行编译(使用4个CPU核心)
make -j4

# 5. 安装(需要root权限)
sudo make install

# 6. 清理
make clean

实战示例: 编译安装Nginx

# 1. 安装依赖
sudo apt install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev

# 2. 下载源码
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -xzf nginx-1.24.0.tar.gz
cd nginx-1.24.0

# 3. 配置
./configure \
  --prefix=/usr/local/nginx \
  --with-http_ssl_module \
  --with-http_v2_module

# 4. 编译
make -j4

# 5. 安装
sudo make install

# 6. 验证
/usr/local/nginx/sbin/nginx -v

# 7. 启动
sudo /usr/local/nginx/sbin/nginx

14.5.3 卸载编译安装的软件

# 方法1: 使用make uninstall(如果支持)
cd software-source-directory
sudo make uninstall

# 方法2: 手动删除
sudo rm -rf /usr/local/software

# 方法3: 使用checkinstall(推荐)
# 安装checkinstall
sudo apt install checkinstall

# 编译时使用checkinstall代替make install
./configure
make
sudo checkinstall
# 这会创建deb/rpm包,方便卸载

14.6 版本管理工具

14.6.1 nvm - Node.js版本管理

# 安装nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

# 重新加载配置
source ~/.bashrc

# 列出可用版本
nvm ls-remote

# 安装Node.js
nvm install 18
nvm install 16
nvm install --lts  # 安装LTS版本

# 查看已安装版本
nvm ls

# 切换版本
nvm use 18
nvm use 16

# 设置默认版本
nvm alias default 18

# 查看当前版本
node --version

# 在项目中指定版本
echo "18" > .nvmrc
nvm use  # 自动使用.nvmrc中的版本

14.6.2 pyenv - Python版本管理

# 安装依赖
sudo apt install -y make build-essential libssl-dev zlib1g-dev \
  libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
  libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

# 安装pyenv
curl https://pyenv.run | bash

# 添加到 ~/.bashrc
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc

# 列出可用版本
pyenv install --list

# 安装Python
pyenv install 3.11.0
pyenv install 3.10.0

# 查看已安装版本
pyenv versions

# 设置全局版本
pyenv global 3.11.0

# 设置项目版本
cd my-project
pyenv local 3.10.0  # 创建.python-version文件

# 查看当前版本
python --version

14.6.3 sdkman - Java/Kotlin/Scala版本管理

# 安装sdkman
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"

# 列出可用的SDK
sdk list java

# 安装JDK
sdk install java 17.0.5-tem
sdk install java 11.0.17-tem

# 查看已安装版本
sdk list java

# 切换版本
sdk use java 17.0.5-tem

# 设置默认版本
sdk default java 17.0.5-tem

# 查看当前版本
java -version

# 安装其他SDK
sdk install gradle
sdk install maven
sdk install kotlin

14.6.4 rbenv - Ruby版本管理

# 安装依赖
sudo apt install -y git curl libssl-dev libreadline-dev zlib1g-dev \
  autoconf bison build-essential libyaml-dev libreadline-dev \
  libncurses5-dev libffi-dev libgdbm-dev

# 安装rbenv
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/main/bin/rbenv-installer | bash

# 添加到 ~/.bashrc
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc

# 列出可用版本
rbenv install --list

# 安装Ruby
rbenv install 3.2.0

# 设置全局版本
rbenv global 3.2.0

# 查看版本
ruby --version

14.7 实战场景

场景1: 配置开发环境

#!/bin/bash
# setup-dev-env.sh - 一键配置开发环境

echo "Setting up development environment..."

# 更新系统
sudo apt update && sudo apt upgrade -y

# 安装基础工具
sudo apt install -y \
  build-essential \
  git \
  curl \
  wget \
  vim \
  tmux \
  htop

# 安装Node.js (使用nvm)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
nvm install --lts

# 安装Python工具
sudo apt install -y python3 python3-pip python3-venv

# 安装Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER

# 配置Git
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
git config --global core.editor vim

# 配置环境变量
cat >> ~/.bashrc <<'EOF'

# Custom environment variables
export EDITOR=vim
export PATH=$PATH:$HOME/bin

# Aliases
alias ll='ls -lah'
alias gs='git status'
alias gp='git pull'
alias dc='docker-compose'
EOF

source ~/.bashrc

echo "Development environment setup complete!"

场景2: 管理多个Java版本

# 安装sdkman
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"

# 安装多个JDK版本
sdk install java 17.0.5-tem
sdk install java 11.0.17-tem
sdk install java 8.0.352-tem

# 项目A使用Java 17
cd ~/projects/project-a
sdk use java 17.0.5-tem
java -version

# 项目B使用Java 11
cd ~/projects/project-b
sdk use java 11.0.17-tem
java -version

# 或使用.sdkmanrc文件
cd ~/projects/project-a
echo "java=17.0.5-tem" > .sdkmanrc
sdk env  # 自动切换到指定版本

场景3: 配置Python虚拟环境

# 方法1: 使用venv
cd my-project
python3 -m venv venv

# 激活虚拟环境
source venv/bin/activate

# 安装依赖
pip install -r requirements.txt

# 退出虚拟环境
deactivate

# 方法2: 使用pyenv + virtualenv
pyenv install 3.11.0
pyenv virtualenv 3.11.0 my-project-env

# 激活
pyenv activate my-project-env

# 自动激活(在项目目录)
cd my-project
pyenv local my-project-env

# 退出
pyenv deactivate

场景4: 配置别名提高效率

# 编辑 ~/.bashrc
nano ~/.bashrc

# 添加常用别名
cat >> ~/.bashrc <<'EOF'

# 导航别名
alias ..='cd ..'
alias ...='cd ../..'
alias ~='cd ~'

# ls别名
alias ll='ls -lah'
alias la='ls -A'
alias l='ls -CF'

# Git别名
alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gp='git pull'
alias gps='git push'
alias gl='git log --oneline --graph --decorate'

# Docker别名
alias d='docker'
alias dc='docker-compose'
alias dps='docker ps'
alias di='docker images'

# 系统别名
alias update='sudo apt update && sudo apt upgrade -y'
alias install='sudo apt install'
alias remove='sudo apt remove'

# 安全别名
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# 快速编辑
alias bashrc='vim ~/.bashrc'
alias vimrc='vim ~/.vimrc'

# 网络
alias myip='curl ifconfig.me'
alias ports='sudo netstat -tulpn'

# 进程
alias psg='ps aux | grep -v grep | grep -i -e VSZ -e'
EOF

# 重新加载
source ~/.bashrc

场景5: 配置开发工具路径

# 配置多个开发工具的环境变量
cat >> ~/.bashrc <<'EOF'

# Java
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin

# Maven
export MAVEN_HOME=/opt/maven
export PATH=$PATH:$MAVEN_HOME/bin

# Gradle
export GRADLE_HOME=/opt/gradle
export PATH=$PATH:$GRADLE_HOME/bin

# Node.js (如果手动安装)
export NODE_HOME=/usr/local/node
export PATH=$PATH:$NODE_HOME/bin

# Go
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

# Rust
export PATH=$PATH:$HOME/.cargo/bin

# Android SDK
export ANDROID_HOME=$HOME/Android/Sdk
export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools
EOF

source ~/.bashrc

14.8 常见问题

Q1: 修改环境变量后不生效?

A:

# 确保重新加载配置文件
source ~/.bashrc

# 或重新登录
exit
# 重新登录

# 检查是否在正确的文件中修改
# Bash: ~/.bashrc 或 ~/.bash_profile
# Zsh: ~/.zshrc

Q2: 如何查看命令来自哪个包?

A:

# Ubuntu/Debian
dpkg -S $(which command)

# 或使用apt-file
sudo apt install apt-file
sudo apt-file update
apt-file search command

# CentOS/RHEL
rpm -qf $(which command)

# 或使用yum
yum provides command

Q3: 如何解决包依赖冲突?

A:

# Ubuntu/Debian
# 1. 尝试修复依赖
sudo apt --fix-broken install

# 2. 清理包缓存
sudo apt clean
sudo apt autoclean

# 3. 更新包列表
sudo apt update

# 4. 重新安装
sudo apt install package-name

# CentOS/RHEL
sudo yum clean all
sudo yum update

Q4: 如何卸载不需要的软件?

A:

# 完全卸载(包括配置)
sudo apt purge package-name

# 删除不需要的依赖
sudo apt autoremove

# 查找残留配置文件
dpkg -l | grep ^rc

# 清理残留配置
sudo apt purge $(dpkg -l | grep ^rc | awk '{print $2}')

Q5: PATH变量太长怎么办?

A:

# 使用函数添加到PATH(避免重复)
add_to_path() {
    if [ -d "$1" ] && [[ ":$PATH:" != *":$1:"* ]]; then
        export PATH="$1:$PATH"
    fi
}

# 在 ~/.bashrc 中使用
add_to_path "$HOME/bin"
add_to_path "$HOME/.local/bin"
add_to_path "/usr/local/bin"

本章总结

核心命令回顾

命令用途示例
export设置环境变量export PATH=$PATH:/new/path
source重新加载配置source ~/.bashrc
which查找命令路径which python
apt install安装软件(Ubuntu)sudo apt install vim
yum install安装软件(CentOS)sudo yum install vim

重要配置文件

文件作用生效时机
~/.bashrcBash配置每次打开终端
~/.bash_profileBash登录配置登录时
~/.zshrcZsh配置每次打开终端
/etc/environment系统环境变量系统启动
/etc/profile系统Shell配置登录时

最佳实践

  • ✅ 用户级配置放在 ~/.bashrc
  • ✅ 使用版本管理工具(nvm、pyenv等)
  • ✅ 定期更新系统和软件包
  • ✅ 使用虚拟环境隔离项目依赖
  • ✅ 备份重要配置文件

下一步

  • 学习Shell脚本入门(第15章)
  • 掌握自动化脚本编写
  • 提升开发效率

练习题:

  1. 创建一个自定义环境变量并永久保存
  2. 添加 ~/bin 到PATH并创建一个可执行脚本
  3. 使用nvm安装两个不同版本的Node.js并切换
  4. 配置5个常用的命令别名

参考答案:

# 1.
echo 'export MY_VAR="test"' >> ~/.bashrc
source ~/.bashrc
echo $MY_VAR

# 2.
mkdir -p ~/bin
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc
source ~/.bashrc
echo '#!/bin/bash' > ~/bin/test.sh
echo 'echo "Hello"' >> ~/bin/test.sh
chmod +x ~/bin/test.sh
test.sh

# 3.
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
source ~/.bashrc
nvm install 18
nvm install 16
nvm use 18
nvm use 16

# 4.
cat >> ~/.bashrc <<'EOF'
alias ll='ls -lah'
alias gs='git status'
alias dc='docker-compose'
alias update='sudo apt update && sudo apt upgrade'
alias myip='curl ifconfig.me'
EOF
source ~/.bashrc

💡 提示: 良好的环境配置是高效开发的基础,花时间优化你的开发环境是值得的!