Linux 环境变量

LinuxBeginner
立即练习

介绍

欢迎参加这个关于 Linux 环境变量的动手实验!环境变量是能够影响计算机上运行进程行为的动态值。它们在系统配置和程序执行中起着至关重要的作用。通过掌握环境变量,你将获得 Linux 系统管理和软件开发的核心技能。

在本实验中,你将学习如何创建、查看、修改和删除环境变量。我们还将探索如何使这些更改永久生效,并了解 Linux 中一些最重要的内置环境变量。无论你是初学者还是希望巩固理解,本实验都将提供宝贵的实践经验。

让我们开始吧!

理解 Linux 中的变量

在深入研究环境变量之前,我们先从基础的 Shell 变量开始。这将帮助你理解 Linux 中变量的概念。

  1. 打开你的终端。你应该处于 /home/labex/project 目录下。如果不是,可以使用以下命令切换到该目录:

    cd /home/labex/project
    
  2. 现在,让我们创建一个简单的 Shell 变量。在 Linux 中,你可以通过简单地为名称赋值来创建变量。让我们创建一个名为 my_var 的变量:

    my_var="Hello, Linux"
    

    重要提示: 在 Bash(以及我们在本实验中使用的 Zsh)中分配变量时,等号(=)两边不能有空格my_var = "Hello, Linux"my_var= "Hello, Linux" 都会导致错误。

  3. 要查看变量的值,我们使用 echo 命令,并在变量名前加上 $ 符号。$ 告诉 Shell 替换该变量的值:

    echo $my_var
    

    你应该会看到输出:

    Hello, Linux
    
  4. 你也可以在其他命令或赋值中使用变量。例如:

    echo "The value of my_var is: $my_var"
    

    这将输出:The value of my_var is: Hello, Linux

做得好!你刚刚创建并使用了你的第一个 Shell 变量。但是,这个变量仅在当前的 Shell 会话中可用。如果你打开一个新的终端窗口或标签页,这个变量将不再可用。这就是环境变量派上用场的地方。

环境变量简介

既然我们理解了基础变量,现在来探索环境变量。环境变量是可供 Shell 的任何子进程使用的变量。这意味着从该 Shell 运行的脚本和程序都可以访问它们。

  1. 要查看当前所有的环境变量,请使用 env 命令:

    env
    

    这将显示一长串变量。如果你现在还不理解所有的变量,请不要担心——我们稍后会介绍其中一些最重要的变量。

  2. 最重要的环境变量之一是 PATH。让我们来看看它:

    echo $PATH
    

    PATH 变量列出了系统查找可执行程序的目录。每个目录之间用冒号(:)分隔。

  3. 现在,让我们创建自己的环境变量。我们使用 export 命令来创建环境变量:

    export MY_ENV_VAR="This is an environment variable"
    

    export 命令使该变量对子进程可用。这是 Shell 变量和环境变量之间的关键区别。

  4. 为了说明这种区别,让我们创建一个 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 没有被导出,所以子进程(如该脚本)不知道它的存在。

  5. 要验证 MY_ENV_VAR 现在确实是一个环境变量,我们可以再次使用 env 命令,但这次我们将使用 grep 过滤输出:

    env | grep MY_ENV_VAR
    

    你应该在输出中看到你的新变量。

  6. 你也可以直接检查新环境变量的值:

    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 中最重要的环境变量之一。它告诉系统去哪里寻找可执行文件。让我们修改它以包含一个新目录。

  1. 首先,让我们创建一个可能用于存储自定义脚本的新目录:

    mkdir ~/my_scripts
    

    这将在你的家目录下创建一个名为 my_scripts 的目录。~ 符号是家目录路径的快捷方式,在本实验中即为 /home/labex

  2. 现在,让我们将这个新目录添加到你的 PATH 中。我们将使用 export 命令,但这次我们要修改一个现有的变量:

    export PATH="$PATH:$HOME/my_scripts"
    

    让我们来分解一下:

    • $PATH 是 PATH 环境变量的当前值。我们正在使用现有值并向其添加内容。
    • : 用于分隔 PATH 中的目录。如果你漏掉了冒号,Shell 将无法在你添加的目录中找到可执行文件。
    • $HOME 是一个指向你家目录的环境变量(在我们的例子中同样是 /home/labex)。
    • 因此,我们将 :$HOME/my_scripts 追加到现有的 PATH 后面。这告诉系统在搜索完原始 PATH 中的目录之后,再去 my_scripts 中查找可执行文件。
  3. 验证新目录是否已添加:

    echo $PATH
    

    你应该在输出的末尾看到 /home/labex/my_scripts。如果它不在末尾,说明你可能以不同的方式修改了它,这也没关系,只要你的 PATH 中包含 /home/labex/my_scripts 路径即可。

  4. 为了测试这一点,让我们在新目录中创建一个简单的脚本:

    cat << 'EOF' > ~/my_scripts/hello.sh
    #!/bin/zsh
    echo "Hello from my custom script!"
    EOF
    

    这会在 ~/my_scripts 目录中创建一个名为 hello.sh 的 Shell 脚本。第一行 #!/bin/zsh 告诉系统这是一个 zsh 脚本,允许它作为程序执行。

  5. 使脚本具有可执行权限:

    chmod +x ~/my_scripts/hello.sh
    

    chmod +x 命令为脚本添加执行权限,使其能够作为程序运行。如果你不执行这一步,尝试执行它时会收到「权限被拒绝」(permission denied)的错误。

  6. 现在,你应该可以通过直接输入脚本名称在任何地方运行它:

    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,变量将不会生效。

  1. 使用文本编辑器打开家目录下的 .zshrc 文件。我们将使用 nano,这是一个简单的基于终端的文本编辑器:

    nano ~/.zshrc
    

    此命令打开 ~/.zshrc 文件,其中 ~ 同样是家目录 /home/labex 的快捷方式。如果 .zshrc 文件不存在,nano 将创建一个新文件。每当你启动一个新的终端会话时,该文件都会被执行。

  2. 滚动到文件底部(可以使用箭头键),并添加以下行:

    export MY_ENV_VAR="This is an environment variable"
    export PATH="$PATH:$HOME/my_scripts"
    

    确保将这些行添加到文件的最底部。确保拼写和语法正确,特别是 = 符号两边不要有空格。

  3. 保存文件并退出编辑器。在 nano 中,你可以通过按 Ctrl+X,然后按 Y(表示保存),最后按 Enter 来完成。

  4. 要在不重启终端的情况下应用这些更改,请使用 source 命令:

    source ~/.zshrc
    

    source 命令在当前 Shell 环境中读取并执行指定为参数的文件中的命令。这与简单地使用 bash ~/.zshrc 执行文件不同,后者会在的 Shell 中运行脚本,不会影响当前 Shell。source当前 Shell 中运行它,因此你的更改会立即生效。如果你跳过这一步,更改将不会在当前终端生效,你必须关闭并重新打开终端才能看到更改。

现在,每当你打开新终端时,这些环境变量都会被设置。这对于一致地设置开发环境非常有用。

了解重要的环境变量

Linux 有几个内置的环境变量,对系统运行至关重要。让我们来探索其中的一些:

  1. HOME:指向当前用户的家目录。

    echo $HOME
    
  2. USER:包含当前用户的用户名。

    echo $USER
    
  3. SHELL:指定用户的默认 Shell。

    echo $SHELL
    
  4. PWD:代表「打印工作目录」(Print Working Directory)。它包含当前目录的路径。

    echo $PWD
    
  5. TERM:指定运行 Shell 时要模拟的终端类型。

    echo $TERM
    

了解这些变量可以帮助你更好地导航和控制 Linux 环境。

取消设置环境变量

有时,你可能需要删除一个环境变量。这可以使用 unset 命令来完成。

  1. 首先,让我们检查 MY_ENV_VAR 是否仍被设置:

    echo $MY_ENV_VAR
    

    你应该能看到我们之前设置的值。

  2. 要取消设置(删除)此变量,请使用 unset 命令:

    unset MY_ENV_VAR
    
  3. 验证变量是否已被取消设置:

    echo $MY_ENV_VAR
    

    你应该看不到任何输出,这表明该变量已不再存在。

  4. 你也可以在 unset 中使用 -v 选项,以确保你取消设置的是变量而不是 Shell 函数:

    unset -v MY_ENV_VAR
    

    这与直接运行 unset MY_ENV_VAR 的结果相同。

请记住,如果你已将变量添加到 .zshrc 文件中,下次打开终端或执行 source .zshrc 时,它会被重新创建。

总结

恭喜!你已完成了这个关于 Linux 环境变量的综合实验。让我们回顾一下你学到的内容:

  1. 你创建并访问了简单的 Shell 变量,理解了它们的作用域。
  2. 你学习了环境变量及其与 Shell 变量的区别,特别是它们对子进程的可访问性,以及 export 命令在其中的关键作用。
  3. 你修改了重要的 PATH 变量以包含自定义目录,从而允许你在系统任何位置运行脚本,并理解了使用冒号 : 分隔条目的重要性。
  4. 你通过将环境变量添加到 .zshrc 使其永久生效,理解了 Bash 和 Zsh Shell 配置的区别,以及使用 source 应用更改的意义。
  5. 你探索了 Linux 中一些最重要的内置环境变量。
  6. 最后,你学习了如何使用 unset 命令取消设置(删除)环境变量。

这些技能是 Linux 系统管理和软件开发的基础。环境变量允许你灵活地配置系统和应用程序。随着你继续使用 Linux,你会发现在脚本编写、开发和系统配置中,环境变量有无数种用途。

记住,熟能生巧。尝试为不同目的创建自己的环境变量,并探索各种应用程序和脚本如何使用环境变量来控制其行为。祝你学习愉快!