在 Linux 中读取与设置环境变量和 Shell 变量
当你通过终端与 Linux 系统交互时,几乎每个命令的运行环境都依赖于一组“变量”——它们共同构成了 Shell 的环境(Environment)。这些变量决定了程序的搜索路径、用户语言、终端行为,甚至权限边界。
理解这些变量的工作机制,是掌握 Linux 系统配置能力的基础之一。
一、环境变量与 Shell 变量的区别
Shell 的运行环境中,变量主要分为两类:
- 环境变量(Environment Variables):从父进程继承,可被子进程访问,通常用于系统级或会话级配置,例如
PATH、LANG、USER等。 - Shell 变量(Shell Variables):仅在当前 Shell 会话中有效,不会被导出给子进程。
在 Bash 中输出环境变量可以使用:
printenv
查看所有变量(包括 Shell 层级)可使用:
set
这两个命令的区别很细微,前者只显示环境层的变量,后者会包含函数定义、局部变量以及 Shell 内部状态。
二、环境变量的工作机制
每次新建一个 Shell 进程时,系统会读取一系列配置文件(如 /etc/profile、~/.bashrc),并构造一个以字符串形式存在的键值对集合:
KEY=value1:value2:...
如果值包含空格,需要用引号包裹:
KEY="value with spaces"
这套机制使得父进程能够把环境信息传递给子进程。例如:
PATH告诉系统命令搜索路径;LANG决定语言和编码;HOME标识当前用户主目录;SHELL定义当前使用的命令解释器路径。
这些变量通常大写,以便在脚本中和普通变量区分开。
三、查看与打印变量
1. 查看环境变量
printenv
或
env
还可以打印单个变量:
printenv PATH
2. 查看所有变量(包括 Shell 层)
set | less
如果不想显示函数定义,可以用 POSIX 模式简化输出:
(set -o posix; set)
3. 查看差异(仅 Shell 层变量)
comm -23 <(set -o posix; set | sort) <(env | sort)
这可大致过滤出非导出的 Shell 局部变量。
四、创建与导出变量
1. 创建普通 Shell 变量
TEST_VAR='Hello World!'
可以通过 $TEST_VAR 访问:
echo $TEST_VAR
此时它只在当前 Shell 中存在,对子进程不可见。
2. 将 Shell 变量导出为环境变量
export TEST_VAR
或直接一步定义:
export TEST_VAR="Hello World!"
现在该变量会被所有子进程继承:
bash
echo $TEST_VAR # 输出 Hello World!
退出子 Shell 后,它仍仅存活于父进程,不会反向传递。
五、取消与还原变量
-
降级(从环境变量回到 Shell 层)
export -n TEST_VAR -
完全删除
unset TEST_VAR
六、登录时自动加载变量
Bash 在启动时会根据会话类型读取不同的配置文件。
| 类型 | 是否需登录认证 | 是否交互 | 配置文件 |
|---|---|---|---|
| 登录 Shell | 是 | 是 | /etc/profile → ~/.bash_profile 或 ~/.profile |
| 非登录 Shell | 否 | 是 | /etc/bash.bashrc → ~/.bashrc |
| 非交互 Shell | 否 | 否 | 从 BASH_ENV 指定的路径载入(通常为 ~/.bashrc) |
推荐做法:
将环境变量放入 ~/.bashrc 中,大多数发行版会自动在登录 Shell 中 source 该文件,从而保证一致性。
设置示例:
# ~/.bashrc
export EDITOR=vim
export PATH="$PATH:$HOME/bin"
立即生效可执行:
source ~/.bashrc
系统级配置则写入 /etc/environment 或 /etc/profile,但需谨慎操作。
七、安全考量
环境变量有时会存放敏感信息(API 密钥、数据库密码等),应格外注意:
- 文件权限:保持配置文件为
600权限; - 避免明文存储:尤其是版本控制仓库;
- 缩小暴露范围:能用 Shell 变量就不要 export;
- 限制可见性:系统级变量对所有用户可见,不宜保存私密信息。
检查文件权限:
ls -l ~/.bashrc
chmod 600 ~/.bashrc
八、常见问题排查
变量在脚本中不可用
- 确认是否使用
export; - 检查脚本是否为非交互 Shell;
- 注意 Shell 区别(例如
/bin/sh与/bin/bash读取的文件不同)。
变量无法持久化
- 确认放置位置(
.bashrcvs.profile); - 语法错误可用
bash -n ~/.bashrc检查; - 确保登录配置正确
source ~/.bashrc。
PATH 问题
- 顺序错误或路径拼写问题;
- 路径分隔使用冒号
:; - 可以用
echo $PATH检查实际效果。
九、FAQ 小结
Q:export 与 env 有何区别?
export把变量加入当前 Shell 环境;env临时为某命令设置环境变量执行。
Q:如何为所有用户设置环境变量?
- 编辑
/etc/environment或/etc/profile; - 修改需 root 权限。
Q:如何永久删除一个环境变量?
- 从配置文件删除并执行
unset; - 重新登录或 reload 配置即可。
十、结语
理解环境变量不仅是熟悉 Linux 命令行的必要环节,更是掌握系统运维、自动化部署和容器配置的基础。
当我们清楚变量的作用域、继承方式与安全限制后,便能更自如地控制系统运行环境,而不必担心那些“神秘”的 PATH 或 LANG 问题。
关于
关注我获取更多资讯