菜鸟科技网

export命令如何设置变量?

什么是 export

export 命令用于将一个 shell 变量变成一个环境变量

export命令如何设置变量?-图1
(图片来源网络,侵删)

这两者有什么区别呢?

  • 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:验证变量类型

我们可以使用 setenv (或 printenv) 命令来查看变量。

  • set:显示所有 shell 变量(包括环境变量和普通 shell 变量)。
  • envprintenv只显示环境变量
# 定义一个普通变量
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 关键之处的最佳例子。

export命令如何设置变量?-图2
(图片来源网络,侵删)
# 在终端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=1export 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 envprintenv
主要用途 存储临时数据、循环计数器等 传递配置信息给程序(如 PATH, HOME)、控制应用行为

掌握 export 是精通 Shell 脚本和系统管理的关键一步,它让你能够有效地在不同程序之间传递配置和控制信息。

分享:
扫描分享到社交APP
上一篇
下一篇