Linux 环境变量

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

欢迎来到这个关于 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 变量和一个环境变量:

    echo '#!/bin/bash
    echo "Shell variable: $my_var"
    echo "Environment variable: $MY_ENV_VAR"' > test_vars.sh

    使脚本可执行:

    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 MY_ENV_VAR="something"),它对从该 shell 启动的任何子进程(例如,由同一 shell 运行的 shell 脚本)都可用。然而,如果你打开一个完全独立的 shell 会话,它不会继承当前 shell 的变量,除非你在启动文件(如 .zshrc.bashrc)中专门设置了它们。

换句话说:

  • 普通的 shell 变量仅在当前会话中可见。
  • 导出的变量对从该会话启动的子进程可用。
  • 在 shell 启动文件(如 .zshrc)中设置的变量会应用于该 shell 的所有新会话。

你无法直接读取另一个用户或另一个 shell 的变量,因为每个进程都维护自己的环境。如果你启动一个新的 shell,它会获得父 shell 导出的变量的副本,但不会获得仅在原始 shell 中设置而未使用 export 的变量。

我们将在接下来的步骤中学习如何永久设置环境变量。

修改 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. 为了测试这一点,让我们在新目录中创建一个简单的脚本:

    echo '#!/bin/bash
    echo "Hello from my custom script!"' > ~/my_scripts/hello.sh

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

  5. 使脚本可执行:

    chmod +x ~/my_scripts/hello.sh

    chmod +x 命令为脚本添加执行权限,允许它作为程序运行。如果你不执行此步骤,当你尝试执行脚本时,会收到“权限被拒绝”的错误。

  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 发行版中仍然是默认 shell),你需要修改 .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 文件中,下次打开终端或重新加载 .zshrc 文件时,它将被重新创建。

总结

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

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

这些技能对于 Linux 系统管理和软件开发至关重要。环境变量使你能够灵活地配置系统和应用程序。随着你继续使用 Linux,你会发现环境变量在脚本编写、开发和系统配置中的无数用途。

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