在 Linux 中读取与设置环境变量和 Shell 变量

本文深入介绍 Linux 系统中环境变量和 Shell 变量的工作机制,涵盖变量的查看、定义、导出与持久化方式,并讨论了变量作用域、安全性及调试技巧。适合希望理解 Bash 环境配置机制的开发者与系统管理员。

阅读时长: 4 分钟
共 1572字
作者: eimoon.com

在 Linux 中读取与设置环境变量和 Shell 变量

当你通过终端与 Linux 系统交互时,几乎每个命令的运行环境都依赖于一组“变量”——它们共同构成了 Shell 的环境(Environment)。这些变量决定了程序的搜索路径、用户语言、终端行为,甚至权限边界。

理解这些变量的工作机制,是掌握 Linux 系统配置能力的基础之一。


一、环境变量与 Shell 变量的区别

Shell 的运行环境中,变量主要分为两类:

  • 环境变量(Environment Variables):从父进程继承,可被子进程访问,通常用于系统级或会话级配置,例如 PATHLANGUSER 等。
  • 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 读取的文件不同)。

变量无法持久化

  • 确认放置位置(.bashrc vs .profile);
  • 语法错误可用 bash -n ~/.bashrc 检查;
  • 确保登录配置正确 source ~/.bashrc

PATH 问题

  • 顺序错误或路径拼写问题;
  • 路径分隔使用冒号 :
  • 可以用 echo $PATH 检查实际效果。

九、FAQ 小结

Q:exportenv 有何区别?

  • export 把变量加入当前 Shell 环境;
  • env 临时为某命令设置环境变量执行。

Q:如何为所有用户设置环境变量?

  • 编辑 /etc/environment/etc/profile
  • 修改需 root 权限。

Q:如何永久删除一个环境变量?

  • 从配置文件删除并执行 unset
  • 重新登录或 reload 配置即可。

十、结语

理解环境变量不仅是熟悉 Linux 命令行的必要环节,更是掌握系统运维、自动化部署和容器配置的基础。
当我们清楚变量的作用域、继承方式与安全限制后,便能更自如地控制系统运行环境,而不必担心那些“神秘”的 PATH 或 LANG 问题。


关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计