如何在 Linux 上的 Bash 中设置环境变量如何在 Linux 上的 Bash 中设置环境变量如何在 Linux 上的 Bash 中设置环境变量如何在 Linux 上的 Bash 中设置环境变量
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Linux 上的 Bash 中设置环境变量

Linux 上有不止一种类型的环境变量。了解如何查看它们,为本地和远程登录创建它们,并使它们在重启后仍然存在。

环境变量如何工作

当您启动终端窗口和其中的 shell 时,会引用一组变量以确保正确配置 shell。这些变量还确保终端窗口和 shell 可能需要参考的任何信息都可用。总的来说,这些变量包含定义您在终端窗口中找到的环境的设置,一直到命令提示符的外观。因此,很自然地,它们被称为环境变量。

一些环境变量是系统范围的或全局的。其他的是会话范围的,只能被你看到。其他人无法引用您的会话环境变量。在 shell 中定义了第三组环境变量。您的语言环境、时区和键盘设置、当 shell 尝试查找命令时搜索的目录集以及您的默认编辑器,都存储在 shell 环境变量中。

我们将向您展示如何查看系统中存在的环境变量,并将描述如何创建您自己的环境变量。我们还将向您展示如何使它们对子进程可用并在重启后保持不变。

环境和继承

当 shell 启动时,它会经历一个初始化阶段。正是在这一点上,它读取定义 shell 环境的环境变量。

当程序或命令从该 shell(称为子进程)启动时,它会继承父进程的环境——但要小心!正如我们将看到的,您可以创建不添加到环境中的变量,因此它们不会被子进程继承。

如果子进程是一个 shell,则该 shell 将从它自己的新变量集进行初始化。因此,如果您更改当前 shell 中的命令提示符,然后启动子 shell,子 shell 将不会继承父 shell 的修改后的命令提示符。

全局环境变量

按照惯例,环境变量的名称都是大写的。以下是一些全局环境变量,以及它们包含的值代表什么:

  • SHELL: 打开终端窗口时将启动的 shell 的名称。在大多数 Linux 发行版中,这将是 bash,除非您更改了默认值。
  • TERM:终端窗口实际上是硬件终端的模拟。这包含将要模拟的硬件终端的类型。
  • USER:当前使用该系统的人的用户名。
  • PWD:当前工作目录的路径。
  • OLDPWD:移动到当前工作目录之前您所在的目录。
  • LS_COLORS:ls 使用的颜色代码列表突出显示不同的文件类型。
  • MAIL:如果 mail 系统已在您的 Linux 计算机上设置(默认情况下未设置),这将保存当前用户的路径邮箱。
  • PATH:一个目录列表,shell 将搜索这些目录以查找命令可执行文件。
  • LANG:语言、本地化和字符编码设置。
  • HOME:当前用户的主目录。
  • _:下划线 (_) 环境变量保存最后输入的命令。

我们可以看到其中一些被设置为使用比 echo 更复杂的东西,它会将值写入终端窗口。要查看环境变量持有的值,您需要在其名称的开头添加一个美元符号 ($)。

一个很好的接触是你可以使用制表符完成来为你填写环境变量名称。输入名字的几个字母并点击 Tab。变量名由shell完成。如果没有发生这种情况,您将需要再键入几个字母以将环境变量与名称以相同字母开头的其他命令区分开来:

echo $SHELL
echo $LANG
echo $HOME
echo $PWD

要创建您自己的全局 环境变量,请将它们添加到/etc/environment 文件。你需要使用 sudo 来编辑这个文件:

sudo gedit /etc/environment

要添加环境变量,请键入其名称、等号 (=) 以及您希望环境变量保留的值。等号 (=) 前后不要有空格。环境变量的名称可以包含字母、下划线 (_) 或数字。但是,名称的第一个字符不能是数字。

如果值中有空格,请确保将整个值括在引号 (\) 中。

保存文件,然后注销并重新登录。使用 echo 测试新变量是否存在并保存您设置的值:

echo $WEBSITE

因为它是一个全局环境变量,并且对所有人都可用,所以用户 mary 可以在下次登录时引用该环境变量:

echo $WEBSITE

要一次查看所有环境变量,请键入 printenv。有很多输出,因此通过 sort 将其通过管道传输,然后进入 less 是有意义的:

printenv | sort | less

在 less 中为我们显示了经过排序的环境变量列表。

我们可以通过 grep 管道输出来查找与特定主题相关的环境变量。

printenv | grep GNOME

外壳环境变量

这些是 bash 中用于指示或记录其行为和功能的一些 shell 环境变量。一些值会在您使用终端时更新。例如,COLUMNS 环境变量将被更新以反映您可能对终端窗口宽度所做的更改:

  • BASHOPTS:启动 bash 时使用的命令行选项。
  • BASH_VERSION:bash 版本号,由单词和数字组成。
  • BASH_VERSINFO:作为数字的 bash 版本。
  • COLUMNS:终端窗口的当前宽度。
  • DIRSTACK:已通过 pushd 命令添加到目录堆栈的目录。
  • HISTFILESIZE:history 文件中允许的最大行数。
  • HISTSIZE:内存中允许的history行数。
  • HOSTNAME:计算机的主机名。
  • IFS:用于分隔命令行输入的内部字段分隔符。默认情况下,这是一个空格。
  • PS1 PS1 环境变量包含主要提示符、默认提示符和命令提示符的定义。命令提示符的定义中可以包含一组称为转义序列的标记。它们代表主机和用户名、当前工作目录和时间等内容。
  • PS2:当一条命令超过一行并且需要更多输入时,会显示辅助命令提示符。 PS2 环境变量保存此辅助提示的定义,默认情况下,它是大于号 (>)。
  • SHELLOPTS:您可以使用 set 选项设置的 Shell 选项。
  • UID:当前用户的用户标识符。

让我们检查其中的一些 shell 变量:

echo $BASH_VERSION
echo $HOSTNAME
echo $COLUMNS
echo $HISTFILESIZE
echo $UID

为了完整起见,以下是您可以在命令提示符定义中使用的标记:

  • \t: 当前时间,格式为 HH:MM:SS。
  • \d:当前日期,表示为工作日、月份、日期。
  • \n:换行符。
  • \s:您的 shell 的名称。
  • \W:您当前工作目录的名称。
  • \w:当前工作目录的路径。
  • \u:登录用户的用户名。
  • \h:计算机的主机名。
  • \#: shell 中的每个命令都有编号。这使您可以在命令提示符中查看命令的编号。这与命令在 history 列表中的编号不同。
  • \$: 将提示的最后一个字符设置为普通用户的美元符号 ($) 和哈希符号 (#) 为根用户。这通过检查用户的 UID 来工作。如果为零,则用户为 root。

您将在 .bashrc 文件中找到 PS1 环境变量的定义。

创建会话环境变量

要创建供您自己使用的环境变量,请将它们添加到您的 .bashrc 文件的底部。如果您想让远程会话(例如 SSH 连接)可以使用环境变量,您还需要将它们添加到您的 .bash_profile 文件中。

两个文件的环境变量定义格式相同。要将定义添加到您的 .bash_profile 文件,请在您的主目录中键入:

gedit .bashrc

我们添加了一个名为 INHERITED_VAR 的环境变量。请注意该行开头的“导出”一词。

完成编辑后保存并关闭文件。您可以注销并重新登录,也可以使用点命令 (.) 使 shell 重新读取 .bash_profile 文件,如下所示:

. .bashrc

现在,让我们在命令行上创建一个环境变量:

LOCAL_VAR="This session only"

如果我们使用 echo,我们可以看到我们可以访问两个环境变量:

echo $LOCAL_VAR
echo $INHERITED_VAR

您会注意到 INHERITED_VAR 环境变量的定义在该行的开头有单词“export”。这意味着环境变量将被当前 shell 的子进程继承。如果我们使用 bash 命令启动另一个,我们可以从子 shell 内部再次检查这两个变量:

bash
echo $LOCAL_VAR
echo $INHERITED_VAR

如您所见,INHERITED_VAR 可在子 shell 中访问,但 LOCAL_VAR 不可访问。我们只是得到一个空行。

虽然“export”在子进程继承的环境中增加了环境变量部分,但是INHERITED_VAR并不是全局环境变量。例如,用户 mary 不能引用它:

echo $INHERITED_VAR

要关闭我们的子 bash 会话,我们使用 exit:

exit

继承的环境也会影响脚本。这是一个简单的脚本,它将我们三个环境变量的值写入终端窗口:

#!/bin/bash

echo "WEBSITE" $WEBSITE
echo "LOCAL_VAR" $LOCAL_VAR
echo "INHERITED_VAR" $INHERITED_VAR

这被保存到一个名为 envtest.sh 的文件中,然后使用以下命令使其可执行:

chmod +x envtest.sh

当我们运行脚本时,它可以访问三个环境变量中的两个:

./envtest.sh

该脚本可以看到 WEBSITE 全局环境变量和 INHERITED_VAR 导出的环境变量。它无法访问 LOCAL_VAR,即使脚本在创建变量的同一 shell 中运行也是如此。

如果需要,我们可以从命令行导出环境变量。我们将对 LOCAL_VAR 执行此操作,然后再次运行脚本:

export LOCAL_VAR
./envtest.sh

环境变量已经添加到当前shell的环境中,因此它出现在脚本继承的环境中。该脚本也可以引用该环境变量。

远程连接

远程登录会话可以访问全局环境变量,但是如果您希望本地定义的环境变量可以远程使用,则必须将它们添加到 .bash_profile 文件中。您可以在 .bashrc 和 .bash_profile 文件中设置相同的环境变量,但值不同。这可以通过脚本获取,例如,为本地或远程使用系统的人修改其行为。

(冒着混淆问题的风险,还有一个 .profile 文件。它也可以保存环境变量定义。但是,如果 .profile 文件不会被读取code>.bash_profile 文件存在。因此,最安全的做法(也是符合 bash 的方式)是使用 .bash_profile 文件。)

要编辑 .bash_profile 文件,我们将再次使用 gedit:

gedit .bash_profile

我们将添加具有与之前使用的相同值的相同环境变量。

保存更改并关闭 gedit。

在另一台计算机上,我们将与测试计算机建立 SSH 连接。

ssh dave@howtogeek.local

连接后,我们将再次运行脚本:

./envtest.sh

.bash_profile 文件已作为远程登录初始化的一部分被读取,INHERITED_VAR 环境变量可供我们和脚本访问。

取消设置环境变量

要取消设置环境变量,请使用 unset 命令。如果我们取消设置全局环境变量 WEBSITE 和导出的环境变量 INHERITED_VAR,它们将不再在命令行或子进程中可用:

unset WEBSITE
unset INHERITED_VAR
./envtest.sh
echo $WEBSITE

需要注意的一点是,这只会更改您在此会话中的全局环境变量的可用性。另一个同时登录的人仍然可以访问他的那个全局环境变量的实例。他的实例在登录过程中从 /etc/environment 文件中初始化和读取,并且独立于任何其他人的变量副本。

例如,用户 mary 仍然可以访问 WEBSITE 环境变量并读取其值,即使用户 dave 已 unset 在他的会话中:

echo $WEBSITE

环境控制

环境变量可用于让脚本和应用程序了解它们的行为方式。它们可用于存储设置或少量数据。例如,脚本可以使用其他脚本可以引用的值填充环境,而无需将它们写入文件。

Linux Commands
Files tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc
Processes alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap
Networking netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld

RELATED: Best Linux Laptops for Developers and Enthusiasts

©2015-2025 艾丽卡 support@alaica.com