介绍
欢迎参加这个关于 Linux 环境变量的动手实验!环境变量是能够影响计算机上运行进程行为的动态值。它们在系统配置和程序执行中起着至关重要的作用。通过掌握环境变量,你将获得 Linux 系统管理和软件开发的核心技能。
在本实验中,你将学习如何创建、查看、修改和删除环境变量。我们还将探索如何使这些更改永久生效,并了解 Linux 中一些最重要的内置环境变量。无论你是初学者还是希望巩固理解,本实验都将提供宝贵的实践经验。
让我们开始吧!
理解 Linux 中的变量
在深入研究环境变量之前,我们先从基础的 Shell 变量开始。这将帮助你理解 Linux 中变量的概念。
打开你的终端。你应该处于
/home/labex/project目录下。如果不是,可以使用以下命令切换到该目录:cd /home/labex/project现在,让我们创建一个简单的 Shell 变量。在 Linux 中,你可以通过简单地为名称赋值来创建变量。让我们创建一个名为
my_var的变量:my_var="Hello, Linux"重要提示: 在 Bash(以及我们在本实验中使用的 Zsh)中分配变量时,等号(
=)两边不能有空格。my_var = "Hello, Linux"或my_var= "Hello, Linux"都会导致错误。要查看变量的值,我们使用
echo命令,并在变量名前加上$符号。$告诉 Shell 替换该变量的值:echo $my_var你应该会看到输出:
Hello, Linux你也可以在其他命令或赋值中使用变量。例如:
echo "The value of my_var is: $my_var"这将输出:
The value of my_var is: Hello, Linux
做得好!你刚刚创建并使用了你的第一个 Shell 变量。但是,这个变量仅在当前的 Shell 会话中可用。如果你打开一个新的终端窗口或标签页,这个变量将不再可用。这就是环境变量派上用场的地方。
环境变量简介
既然我们理解了基础变量,现在来探索环境变量。环境变量是可供 Shell 的任何子进程使用的变量。这意味着从该 Shell 运行的脚本和程序都可以访问它们。
要查看当前所有的环境变量,请使用
env命令:env这将显示一长串变量。如果你现在还不理解所有的变量,请不要担心——我们稍后会介绍其中一些最重要的变量。
最重要的环境变量之一是
PATH。让我们来看看它:echo $PATHPATH变量列出了系统查找可执行程序的目录。每个目录之间用冒号(:)分隔。现在,让我们创建自己的环境变量。我们使用
export命令来创建环境变量:export MY_ENV_VAR="This is an environment variable"export命令使该变量对子进程可用。这是 Shell 变量和环境变量之间的关键区别。为了说明这种区别,让我们创建一个 Shell 脚本,尝试同时访问一个普通的 Shell 变量和一个环境变量。我们可以使用
cat命令配合heredoc来实现,这是向文件写入多行内容的常用方法:cat << 'EOF' > test_vars.sh #!/bin/bash echo "Shell variable: $my_var" echo "Environment variable: $MY_ENV_VAR" EOF使脚本具有可执行权限:
chmod +x test_vars.sh现在运行脚本:
./test_vars.sh你应该会看到环境变量(
MY_ENV_VAR)是可以访问的,而 Shell 变量(my_var)则不行。这是因为my_var没有被导出,所以子进程(如该脚本)不知道它的存在。要验证
MY_ENV_VAR现在确实是一个环境变量,我们可以再次使用env命令,但这次我们将使用grep过滤输出:env | grep MY_ENV_VAR你应该在输出中看到你的新变量。
你也可以直接检查新环境变量的值:
echo $MY_ENV_VAR
太棒了!你现在已经创建了你的第一个环境变量,并了解了它与 Shell 变量的区别。关键区别在于,使用 export 创建的环境变量对子进程可用,而 Shell 变量则不可用。
环境变量和 Shell 变量各有其作用域。当你导出(export)一个变量时(例如 export MY_ENV_VAR="something"),它对于从该 Shell 启动的任何子进程(例如由该 Shell 运行的脚本)都是可见的。但是,如果你打开一个完全独立的 Shell 会话,它不会继承当前 Shell 的变量,除非你专门在启动文件(如 .zshrc 或 .bashrc)中设置它们。
换句话说:
- 普通 Shell 变量仅在当前会话中可见。
- 导出的变量对从该会话启动的子进程可用。
- 在 Shell 启动文件(如
.zshrc)中设置的变量适用于该 Shell 的所有新会话。
你无法直接读取另一个用户或其他 Shell 的变量,因为每个进程都维护着自己的环境。如果你启动一个新的 Shell,它会获得父进程导出变量的副本,但不会获得那些在原始 Shell 中未经过 export 设置的变量。
我们将在接下来的步骤中学习如何永久设置环境变量。
变量持久化级别
为了帮助你直观地理解这些变量类型及其持久化级别的区别,这里有一个全面的概览:
graph LR
A["Linux 变量类型"] --> B["Shell 变量"]
A --> C["环境变量"]
A --> D["永久变量"]
B --> B1["仅限当前会话"]
B --> B2["不被继承"]
B --> B3["退出即丢失"]
C --> C1["会话作用域"]
C --> C2["子进程可访问"]
C --> C3["退出即丢失"]
D --> D1["所有新会话"]
D --> D2["子进程可访问"]
D --> D3["持久化保存"]
B1 --> E1["my_var='value'"]
C2 --> E2["export VAR='value'"]
D3 --> E3["~/.zshrc 文件"]
style B fill:#ffebee
style C fill:#fff3e0
style D fill:#e8f5e8
该图展示了变量持久化的三个级别。以下是快速参考摘要表:
| 变量类型 | 作用域 | 子进程访问 | 持久性 | 语法示例 |
|---|---|---|---|---|
| Shell 变量 | 仅限当前会话 | 否 | 退出即丢失 | my_var='value' |
| 环境变量 | 当前会话 | 是 | 退出即丢失 | export VAR='value' |
| 永久变量 | 所有新会话 | 是 | 退出后依然存在 | 在 ~/.zshrc 文件中 |
理解这三个级别对于有效的 Linux 系统管理至关重要,并将帮助你针对不同场景选择正确的方法。
修改 PATH 环境变量
PATH 变量是 Linux 中最重要的环境变量之一。它告诉系统去哪里寻找可执行文件。让我们修改它以包含一个新目录。
首先,让我们创建一个可能用于存储自定义脚本的新目录:
mkdir ~/my_scripts这将在你的家目录下创建一个名为
my_scripts的目录。~符号是家目录路径的快捷方式,在本实验中即为/home/labex。现在,让我们将这个新目录添加到你的
PATH中。我们将使用export命令,但这次我们要修改一个现有的变量:export PATH="$PATH:$HOME/my_scripts"让我们来分解一下:
$PATH是 PATH 环境变量的当前值。我们正在使用现有值并向其添加内容。:用于分隔 PATH 中的目录。如果你漏掉了冒号,Shell 将无法在你添加的目录中找到可执行文件。$HOME是一个指向你家目录的环境变量(在我们的例子中同样是/home/labex)。- 因此,我们将
:$HOME/my_scripts追加到现有的 PATH 后面。这告诉系统在搜索完原始PATH中的目录之后,再去my_scripts中查找可执行文件。
验证新目录是否已添加:
echo $PATH你应该在输出的末尾看到
/home/labex/my_scripts。如果它不在末尾,说明你可能以不同的方式修改了它,这也没关系,只要你的 PATH 中包含/home/labex/my_scripts路径即可。为了测试这一点,让我们在新目录中创建一个简单的脚本:
cat << 'EOF' > ~/my_scripts/hello.sh #!/bin/zsh echo "Hello from my custom script!" EOF这会在
~/my_scripts目录中创建一个名为hello.sh的 Shell 脚本。第一行#!/bin/zsh告诉系统这是一个 zsh 脚本,允许它作为程序执行。使脚本具有可执行权限:
chmod +x ~/my_scripts/hello.shchmod +x命令为脚本添加执行权限,使其能够作为程序运行。如果你不执行这一步,尝试执行它时会收到「权限被拒绝」(permission denied)的错误。现在,你应该可以通过直接输入脚本名称在任何地方运行它:
hello.sh如果一切正常,你应该看到:
Hello from my custom script!
这之所以有效,是因为我们将 my_scripts 目录添加到了 PATH 中。当你输入一个命令时,Shell 会按顺序在 PATH 中列出的每个目录中查找具有该名称的可执行文件。通过将 my_scripts 添加到 PATH,我们告诉了 Shell 也要去那里查找可执行文件。
为了演示这一点,尝试切换到另一个目录并再次运行脚本:
cd /tmp
hello.sh
你会发现脚本仍然可以运行,即使你不在它所在的目录中。这就是 PATH 变量的力量——它允许你从系统中的任何位置运行可执行文件,只要它们位于 PATH 列出的目录中。
做得好!你已成功修改了 PATH 环境变量,并创建了一个可以在任何地方运行的自定义脚本。
使环境变量永久生效
我们设置的环境变量在关闭终端时会丢失。要使它们永久生效,我们需要将它们添加到 Shell 配置文件中。具体文件取决于你使用的 Shell。
在本实验环境中,我们使用的是 Z shell (zsh),它是 Bourne Shell (sh) 的扩展版本,具有许多改进,包括 Bash、ksh 和 tcsh 的一些特性。Zsh 越来越受欢迎,现在已成为 macOS 的默认 Shell。
如果你使用的是 Bash(在许多 Linux 发行版中仍是默认设置),你会修改 .bashrc。但是,由于我们使用的是 Zsh,我们将修改 .zshrc。使用正确的文件非常重要。如果你在使用 zsh 时修改了 .bashrc,变量将不会生效。
使用文本编辑器打开家目录下的
.zshrc文件。我们将使用nano,这是一个简单的基于终端的文本编辑器:nano ~/.zshrc此命令打开
~/.zshrc文件,其中~同样是家目录/home/labex的快捷方式。如果.zshrc文件不存在,nano将创建一个新文件。每当你启动一个新的终端会话时,该文件都会被执行。滚动到文件底部(可以使用箭头键),并添加以下行:
export MY_ENV_VAR="This is an environment variable" export PATH="$PATH:$HOME/my_scripts"确保将这些行添加到文件的最底部。确保拼写和语法正确,特别是
=符号两边不要有空格。保存文件并退出编辑器。在 nano 中,你可以通过按
Ctrl+X,然后按Y(表示保存),最后按Enter来完成。要在不重启终端的情况下应用这些更改,请使用
source命令:source ~/.zshrcsource命令在当前 Shell 环境中读取并执行指定为参数的文件中的命令。这与简单地使用bash ~/.zshrc执行文件不同,后者会在新的 Shell 中运行脚本,不会影响当前 Shell。source在当前 Shell 中运行它,因此你的更改会立即生效。如果你跳过这一步,更改将不会在当前终端生效,你必须关闭并重新打开终端才能看到更改。
现在,每当你打开新终端时,这些环境变量都会被设置。这对于一致地设置开发环境非常有用。
了解重要的环境变量
Linux 有几个内置的环境变量,对系统运行至关重要。让我们来探索其中的一些:
HOME:指向当前用户的家目录。echo $HOMEUSER:包含当前用户的用户名。echo $USERSHELL:指定用户的默认 Shell。echo $SHELLPWD:代表「打印工作目录」(Print Working Directory)。它包含当前目录的路径。echo $PWDTERM:指定运行 Shell 时要模拟的终端类型。echo $TERM
了解这些变量可以帮助你更好地导航和控制 Linux 环境。
取消设置环境变量
有时,你可能需要删除一个环境变量。这可以使用 unset 命令来完成。
首先,让我们检查
MY_ENV_VAR是否仍被设置:echo $MY_ENV_VAR你应该能看到我们之前设置的值。
要取消设置(删除)此变量,请使用
unset命令:unset MY_ENV_VAR验证变量是否已被取消设置:
echo $MY_ENV_VAR你应该看不到任何输出,这表明该变量已不再存在。
你也可以在
unset中使用-v选项,以确保你取消设置的是变量而不是 Shell 函数:unset -v MY_ENV_VAR这与直接运行
unset MY_ENV_VAR的结果相同。
请记住,如果你已将变量添加到 .zshrc 文件中,下次打开终端或执行 source .zshrc 时,它会被重新创建。
总结
恭喜!你已完成了这个关于 Linux 环境变量的综合实验。让我们回顾一下你学到的内容:
- 你创建并访问了简单的 Shell 变量,理解了它们的作用域。
- 你学习了环境变量及其与 Shell 变量的区别,特别是它们对子进程的可访问性,以及
export命令在其中的关键作用。 - 你修改了重要的 PATH 变量以包含自定义目录,从而允许你在系统任何位置运行脚本,并理解了使用冒号
:分隔条目的重要性。 - 你通过将环境变量添加到
.zshrc使其永久生效,理解了 Bash 和 Zsh Shell 配置的区别,以及使用source应用更改的意义。 - 你探索了 Linux 中一些最重要的内置环境变量。
- 最后,你学习了如何使用
unset命令取消设置(删除)环境变量。
这些技能是 Linux 系统管理和软件开发的基础。环境变量允许你灵活地配置系统和应用程序。随着你继续使用 Linux,你会发现在脚本编写、开发和系统配置中,环境变量有无数种用途。
记住,熟能生巧。尝试为不同目的创建自己的环境变量,并探索各种应用程序和脚本如何使用环境变量来控制其行为。祝你学习愉快!



