export是Bash等Shell的内建命令,用于将Shell变量标记为“导出”,使其能够被子进程(如子Shell、脚本、外部命令)继承。在Linux/Unix系统中,环境变量是进程间传递配置信息的主要方式,export正是连接当前Shell与子进程环境的桥梁。
export的应用场景包括:设置应用程序的配置参数、调整命令的行为(如LANG影响语言)、扩展PATH以查找可执行文件、在脚本间共享变量等。理解export的工作原理,是掌握Linux环境变量管理和Shell编程的基础。
1. 基本语法
| 命令 | 说明 |
|---|
export 变量名=值 | |
变量名=值; export 变量名 | |
export 变量名 | |
export -p | |
export -n 变量名 | |
help export | |
2. 导出变量
| 命令 | 说明 |
|---|
export APP_ENV=production | |
PORT=8080; export PORT | |
export PATH="$HOME/bin:$PATH" | |
export EDITOR=vim | |
export LANG=zh_CN.UTF-8 | |
export PS1='[\u@\h \W]\$ ' | |
export JAVA_HOME=/usr/lib/jvm/java-11 | |
3. 当前会话有效
这些更改仅在当前Shell会话中有效,退出终端或新开窗口后失效。
| 命令 | 说明 |
|---|
export DEBUG=true | |
export API_URL=https://api.example.com | |
export PATH="$HOME/.local/bin:$PATH" | |
echo "$API_URL" | |
bash -c 'echo "$API_URL"' | |
env | grep API_URL | |
4. 导出函数
Bash支持将函数导出到子Bash Shell中。
| 命令 | 说明 |
|---|
greet() { echo "你好,$1"; } | |
export -f greet | |
bash -c 'greet "张三"' | |
export -nf greet | |
unset -f greet | |
5. 移除或重置导出
| 命令 | 说明 |
|---|
export -n VAR | 移除VAR的导出属性(变量本身保留,但子进程不再继承) |
unset VAR | |
unset -f function_name | |
export -n PATH | |
VAR=新值 | |
env | grep '^变量名=' | |
6. 常用环境变量示例
| 变量名 | 说明与示例 |
|---|
PATH | 命令搜索路径:export PATH="$HOME/bin:$PATH" |
HOME | |
USER | |
SHELL | |
LANG | 语言环境:export LANG=zh_CN.UTF-8 |
LC_ALL | 覆盖所有locale设置:export LC_ALL=C(用于脚本提高可预测性) |
EDITOR | |
PAGER | |
PS1 | |
TZ | 时区设置:export TZ='Asia/Shanghai' |
http_proxy | HTTP代理:export http_proxy=http://proxy:8080 |
JAVA_HOME | |
PYTHONPATH | |
7. 使变量永久生效
在Shell启动文件中添加export行,使变量在每次登录时自动设置。
| 文件 | 说明 |
|---|
~/.bashrc | 交互式非登录Bash Shell(最常用,每个新终端都加载) |
~/.bash_profile | 登录Bash Shell(通常会source .bashrc) |
~/.profile | 兼容各Shell的登录文件(Bash登录时也会读取) |
/etc/environment | 系统级环境变量文件(语法为变量名=值,不支持export) |
/etc/profile | |
/etc/bash.bashrc | |
source ~/.bashrc | |
示例:在~/.bashrc中添加
export EDITOR=vim
export PATH="$HOME/.local/bin:$PATH"
export PS1='[\u@\h \W]\$ '
8. 实用组合模式
| 命令/脚本 | 说明 |
|---|
export $(cat .env | xargs) | |
env -i bash -c 'export VAR=值; 命令' | |
export DEBUG=1 && ./script.sh | |
(export SECRET=123; ./app) | |
printenv | grep -E 'PATH|HOME' | |
diff <(export -p) <(bash -c 'export -p') | |
9. 常用选项速查
10. 故障排查
| 问题 | 解决方法 |
|---|
| 子进程看不到变量 | 确认使用了export;检查是否在同一Shell执行;子进程类型是否继承环境 |
| 新终端中变量消失 | 将export行添加到~/.bashrc或相应启动文件;重启终端或source ~/.bashrc |
| 函数在子Shell中不可用 | 使用export -f 函数名导出;确保子Shell是Bash |
| export -n后变量还在但子进程可见 | export -n |
| 变量已设置但程序忽略 | 检查程序实际读取的变量名;有些程序读取配置文件而非环境变量 |
| PATH被覆盖导致命令找不到 | 不要写成export PATH=/new/path(会覆盖),应写成export PATH=/new/path:$PATH |
| export: command not found | export是内建命令,不应该出现此错误;确认Shell类型(如sh可能不支持export -f) |
| 环境变量包含特殊字符 | 使用引号:export VAR="值包含 空格和$符号" |
温馨提示: export的生命周期遵循“当前Shell及其子进程”原则。在终端设置的export仅对当前会话有效,退出后失效。要使变量永久生效,必须写入Shell配置文件中。调试时可用export -p查看当前所有导出变量,用env命令查看完整的环境变量。在脚本中,建议在文件开头集中export所需变量,提高可读性和可维护性。