什么是 export?
export 命令用于将一个 shell 变量变成一个环境变量。

这两者有什么区别呢?
- Shell 变量:只在当前 Shell 会话中有效,如果你在一个终端窗口定义了一个 shell 变量,它只对这个窗口的命令可见,如果你在这个窗口中打开一个新的 Shell(运行
bash),这个新 Shell 将无法访问到那个变量。 - 环境变量:可以被当前 Shell 会话及其所有子进程(child processes)访问,当你运行一个程序或脚本时,这个程序/脚本就是当前 Shell 的一个子进程。
export的作用就是将变量“传递”给这些子进程。
基本语法
export VAR_NAME[=value]
VAR_NAME:变量名,通常使用大写字母是惯例。value:变量的值,如果省略=value,则表示将一个已存在的 shell 变量VAR_NAME导出为环境变量。
使用示例
示例 1:创建并导出一个新变量
这是最常见的用法。
# 1. 定义一个普通的 shell 变量 MY_SHELL_VAR="Hello, I am a shell variable" # 2. 使用 export 将其变为环境变量 export MY_SHELL_VAR # 或者,一步完成定义和导出 export MY_ENV_VAR="Hello, I am an environment variable"
示例 2:验证变量类型
我们可以使用 set 和 env (或 printenv) 命令来查看变量。
set:显示所有 shell 变量(包括环境变量和普通 shell 变量)。env或printenv:只显示环境变量。
# 定义一个普通变量 NORMAL_VAR="I am normal" # 定义并导出一个环境变量 export EXPORTED_VAR="I am exported" # 使用 set 查看所有变量,可以看到 NORMAL_VAR 和 EXPORTED_VAR set | grep -E "(NORMAL|EXPORTED)_VAR" # 输出: # NORMAL_VAR='I am normal' # EXPORTED_VAR='I am exported' # 使用 env 查看环境变量,只能看到 EXPORTED_VAR env | grep -E "(NORMAL|EXPORTED)_VAR" # 输出: # EXPORTED_VAR=I am exported
示例 3:验证变量的作用域(子进程继承)
这是理解 export 关键之处的最佳例子。

# 在终端1(父 Shell)中 export PARENT_VAR="I come from the parent shell" # 启动一个新的子 Shell bash # 在新的子 Shell 中,查看这个变量 echo $PARENT_VAR # 输出: I come from the parent shell <-- 成功继承了! # 在子 Shell 中尝试创建一个新变量 CHILD_VAR="I am only in the child shell" # 退出子 Shell,回到父 Shell exit # 在父 Shell 中查看子 Shell 创建的变量 echo $CHILD_VAR # 输出: (空) <-- 因为 CHILD_VAR 只是子 Shell 的普通变量,没有导出,父 Shell 无法访问
示例 4:在 Shell 脚本中使用
当你写一个 Shell 脚本时,这个脚本会继承父 Shell 的所有环境变量。
脚本 test_script.sh:
#!/bin/bash # 这个脚本会自动访问到父 Shell 中通过 export 设置的变量 echo "The value of MY_APP_PATH is: $MY_APP_PATH" # 如果这个脚本内部创建了一个新变量,它默认只在脚本内部有效 LOCAL_SCRIPT_VAR="This is inside the script" echo "Inside script, LOCAL_SCRIPT_VAR is: $LOCAL_SCRIPT_VAR"
在终端中运行:
# 1. 在父 Shell 中导出一个变量 export MY_APP_PATH="/usr/local/my_app" # 2. 给脚本执行权限 chmod +x test_script.sh # 3. 运行脚本 ./test_script.sh # 输出: # The value of MY_APP_PATH is: /usr/local/my_app # Inside script, LOCAL_SCRIPT_VAR is: This is inside the script # 4. 在父 Shell 中尝试访问脚本内部的变量 echo $LOCAL_SCRIPT_VAR # 输出: (空) <-- 因为 LOCAL_SCRIPT_VAR 没有被 export,所以只在脚本的生命周期内有效
export 的其他重要用法
export 命令不仅可以用于自定义变量,还可以用来设置或修改 Shell 的行为。
设置 PATH 变量
PATH 是最重要的环境变量之一,它告诉 Shell 在哪里可以找到可执行文件。
# 查看当前的 PATH echo $PATH # 输出类似: /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin # 假设你有一个自定义程序放在 ~/mytools/bin 目录下 # 你可以将它添加到 PATH 的末尾 export PATH="$PATH:$HOME/mytools/bin" # 或者添加到开头(不推荐,可能会覆盖系统命令) # export PATH="$HOME/mytools/bin:$PATH" # 你就可以直接在任意位置运行 ~/mytools/bin 下的程序了
设置 Shell 选项
你可以使用 export 来设置一些影响 Shell 行为的选项。
# 设置一个名为 DEBUG_MODE 的环境变量,值为 1 export DEBUG_MODE=1 # 在你的脚本中,可以检查这个变量来决定是否开启调试信息 if [ "$DEBUG_MODE" = "1" ]; then echo "Debug mode is ON." set -x # 打开调试模式 fi
常见问题与最佳实践
Q: export VAR=1 和 export VAR="1" 有什么区别?
A: 双引号 会进行变量扩展和历史命令扩展等,如果值中包含空格或特殊字符,强烈建议使用双引号。
# 错误的示例 export GREETING=hello world # Shell 会把它当作两个命令:GREETING=hello 和 world echo $GREETING # 输出: hello # 正确的示例 export GREETING="hello world" echo $GREETING # 输出: hello world
Q: 如何永久设置环境变量?
A: export 命令只在当前 Shell 会话中有效,关闭终端后,变量就会消失,要永久设置,需要将 export 命令写入 Shell 的配置文件中。
-
对于当前用户:编辑
~/.bashrc,~/.zshrc(对于 zsh) 等文件。# 打开 ~/.bashrc 文件 nano ~/.bashrc # 在文件末尾添加 export MY_PERMANENT_VAR="This will last forever" # 保存文件后,让配置生效 source ~/.bashrc
-
对于所有用户:编辑
/etc/profile或/etc/environment文件(需要管理员权限)。
Q: unset 命令是什么?
A: unset 用于删除一个变量,无论是 shell 变量还是环境变量。
export TEMP_VAR="I will be gone" echo $TEMP_VAR # 输出: I will be gone unset TEMP_VAR echo $TEMP_VAR # 输出: (空)
| 特性 | Shell 变量 (e.g., MY_VAR="foo") |
环境变量 (e.g., export MY_VAR="foo") |
|---|---|---|
| 作用域 | 仅限当前 Shell | 当前 Shell 及其所有子进程 |
| 创建方式 | VAR_NAME=value |
export VAR_NAME=value |
| 查看命令 | set |
env 或 printenv |
| 主要用途 | 存储临时数据、循环计数器等 | 传递配置信息给程序(如 PATH, HOME)、控制应用行为 |
掌握 export 是精通 Shell 脚本和系统管理的关键一步,它让你能够有效地在不同程序之间传递配置和控制信息。
