
你输入ls,系统知道你要执行/bin/ls。你输入python,系统知道去/usr/bin/python找。你从来没告诉过系统这些命令在哪里,但它就是能找到。你登录系统后,自动到了/home/你的用户名目录下,而不是根目录。你从未设置过默认目录,但它就是知道。
这些行为背后的逻辑,是环境变量。它们是一组系统级别的“默认设置”。
环境变量是什么
环境变量是操作系统用来存储系统级配置信息的键值对。它们存在于每个进程的内存空间中,由父进程传递给子进程。
用env命令查看当前环境:
bash
env
你看到的是一大串KEY=value。每个都是正在运行的shell中定义的环境变量。
用echo查看特定变量:
bash
echo $PATH echo $HOME echo $SHELL
PATH:命令的搜索路径
PATH是最重要的环境变量。它决定了你在终端输入命令时,系统去哪里查找对应的程序。
查看PATH:
bash
echo $PATH
输出类似:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
每个目录用冒号分隔。当你输入ls时,系统按顺序在/usr/local/bin、/usr/bin、/bin等目录中查找名为ls的可执行文件,找到就执行。
你遇到过的场景:你装了一个程序,输入命令却提示command not found。原因是程序安装到了/opt/myapp/bin,但你的PATH中没有包含这个目录。
临时添加目录到PATH:
bash
export PATH=$PATH:/opt/myapp/bin
永久添加:写到~/.bashrc或/etc/profile中。
HOME:用户的家目录
HOME变量指向当前用户的主目录。你登录系统后,默认所在的目录就是这个。
bash
echo $HOME # 输出:/home/用户名
用cd不带参数,直接回到HOME。~符号在shell中就是HOME的快捷方式。很多程序的配置文件默认存放在$HOME/.config/或$HOME/.程序名。
SHELL:当前使用的Shell类型
SHELL变量记录你当前正在使用的shell解释器。
bash
echo $SHELL # 输出:/bin/bash 或 /bin/zsh 或 /bin/sh
它决定了命令行语法、快捷键、配置文件。每个shell有自己的配置文件:
- Bash:
~/.bashrc、~/.bash_profile - Zsh:
~/.zshrc - Sh:
~/.profile
USER、UID、PWD:当前用户和环境信息
bash
echo $USER # 当前用户名 echo $UID # 用户ID echo $PWD # 当前工作目录
USER用于判断当前是谁在操作,脚本里可能用来决定加载哪个配置文件。UID为0表示root用户。PWD就是pwd命令的输出,每次cd后自动更新。
LANG和LC_ALL:系统的语言设置
它们决定系统显示的语言和字符编码。
bash
echo $LANG # 输出:en_US.UTF-8
如果你的服务器显示中文乱码,通常是LANG或LC_ALL设置不对,或者终端软件字符编码设置与服务器不一致。
临时变量、永久变量、登录变量的区别
临时设置:只在当前终端窗口有效,关闭后失效。
bash
export MY_VAR="hello"
永久设置(用户级):写入~/.bashrc或~/.zshrc。每次打开新终端都会加载。
永久设置(系统级):写入/etc/profile或/etc/environment。影响所有用户。
| 文件 | 生效范围 | 加载时机 |
|---|---|---|
~/.bashrc | 当前用户 | 每次打开新shell |
~/.bash_profile | 当前用户 | 登录时加载一次 |
/etc/profile | 所有用户 | 登录时加载 |
/etc/environment | 所有用户 | 系统启动时加载 |
.bashrc每次打开新终端都执行,.bash_profile只在登录时执行一次,适合设置一次性的环境变量。
实战场景
场景一:安装的程序找不到命令
新装了一个helm,但输入helm提示找不到。你需要把helm的安装目录加到PATH:
bash
export PATH=$PATH:/usr/local/helm/bin
想永久生效,把这行加到~/.bashrc。
场景二:每次登录都要切换到指定目录
在~/.bashrc中添加:
bash
cd /var/www/html
每次打开终端自动切换到工作目录。
场景三:设置代理
bash
export http_proxy=http://proxy.example.com:8080 export https_proxy=http://proxy.example.com:8080
一个真实案例
某运维在服务器上安装了Python 3.9,但输入python总是启动2.7。检查PATH发现/usr/bin在/usr/local/bin之前,而2.7在/usr/bin下。调整PATH顺序后,Python 3.9成为默认版本。
最后一句
环境变量管理着系统的日常行为。PATH告诉你命令从哪来,HOME让你知道自己在哪,SHELL决定了你的终端怎么工作。变量有临时和永久之分,选错了文件,改完半天不生效。下次你安装一个程序却发现找不到时,检查一下PATH。它告诉你路径里有什么。




