在计算机科学中,变量是一个代表可以改变的值的词。你在日常讲话中每天都使用变量,尽管你没有将它们视为变量。当你说到“我的车”时,你正在使用“我的车”作为一种变量,它指的是你当时拥有的任何汽车。随着你用新车更换旧车,汽车的品牌和型号肯定会改变,但是通过创建“我的车”这个变量,你每次想提及你的车辆时,不必啰嗦地说出你目前碰巧拥有的汽车类型。
在计算机上,变量以类似的方式使用。
例如,在计算机上拥有用户帐户的任何人都拥有一个主目录,计算机在其中保存他们的个人数据。但是每个用户都有一个不同的主目录(Seth 的是 /home/seth
,Tux 的是 /home/tux
,每个用户都依此类推),因此当你想泛指主目录时,你可以使用变量 $HOME
来指示当前用户的主目录,而不管用户的登录名是什么。
环境变量是特殊的变量(如 $HOME
),其中包含有关你的登录会话的信息。它们被存储以供系统 shell 在执行命令时使用。无论你使用的是 Linux、Mac 还是 Windows,它们都存在。许多这些变量在安装或用户创建期间默认设置。
虽然环境变量适用于所有现代系统,但本文专门讨论 Linux、BSD、Mac 和 Cygwin 上 Bash shell 中的环境变量。
理解环境变量
从技术上讲,环境变量与变量没有区别。可以使用与变量完全相同的语法来设置、调用和清除它们。如果你不习惯在 Bash 中使用变量,请在继续之前阅读我的 Bash 中的变量 文章。
你通常不直接使用环境变量。它们由各个应用程序和守护进程根据需要引用。例如,你的主目录在你登录时被设置为环境变量。例如,在 Linux 上,你可以像这样查看你的 HOME 环境变量的内容
$ echo $HOME
HOME=/home/seth
在 Mac 上
$ echo $HOME
HOME=/Users/bogus
在 Windows 上
C:\Users\bogus
你可以使用 env 命令查看系统上设置的所有环境变量。列表很长,因此通过 more 管道输出使其更易于阅读
$ env | more
TERM=xterm-256color
LESSOPEN=||/usr/bin/lesspipe.sh %s
USER=seth
SUDO_EDITOR=emacs
WWW_HOME=http://mirror.lagoon.nc/pub/slackware/slackware64-current/ChangeLog.txt
VISUAL=emacs
DISPLAY=:0
PS1=$
XDG_DATA_DIRS=/home/seth/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin
GDMSESSION=gnome
MAIL=/var/spool/mail/seth
[...]
当你想覆盖默认设置,或者当你需要管理系统本身没有理由创建的新设置时,环境变量可能很有用。例如,当你输入命令时,你的计算机知道如何查找与该命令对应的应用程序的唯一原因是 PATH 环境变量告诉它在哪里查找。此变量列出了操作系统搜索命令的有效目录,无论该命令是 ls 还是 cp,还是像 Firefox 或 Lutris 这样的图形应用程序,或其他任何东西。
不同的系统使用不同的环境变量。例如,你的 PATH 变量对于你的终端模拟器至关重要,但对于 Java 来说重要性要小得多(Java 有自己的路径,指向重要的 Java 库)。但是,USER 变量被多个系统用作识别谁在请求服务的方式。例如,如果你在多用户系统上并且需要检查你的本地邮箱,你的 mail 命令知道要根据 MAIL 和 USER 变量检索哪个邮件池。
设置环境变量
通常,安装程序,无论是 Fedora 上的 dnf、Ubuntu 上的 apt、Mac 上的 brew 还是自定义安装程序,都会为新应用程序更新你的环境变量。但是,有时,当你在你的发行版的预期工具集之外安装某些东西时,你可能必须自己管理环境变量。或者你可以选择添加环境变量以满足你的偏好。如果你决定将一些应用程序保存在位于你的主目录中的 bin 文件夹中,那么你必须将该目录添加到你的 PATH 中,以便你的操作系统知道在那里查找要运行的应用程序,当你发出命令时。
临时环境变量
你可以像创建一次性变量一样将位置添加到你的路径中。它可以工作,但仅在用于修改系统路径的 shell 保持打开状态时才有效。例如,打开一个 Bash shell 并修改你的系统路径
$ export PATH=$PATH:/home/seth/bin
确认结果
$ echo $PATH
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin:/home/seth/bin
关闭会话
$ exit
打开一个新的会话并查看 PATH 变量
$ echo $PATH
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin
此变量已恢复为其默认状态,因为 PATH 不会在每个新 shell 中设置。为此,你必须配置你的变量以在每次启动 shell 时加载。
永久环境变量
你可以在你的 shell 配置文件中设置你自己的持久环境变量,其中最常见的是 ~/.bashrc。如果你是管理多个用户的系统管理员,你还可以在放置在 /etc/profile.d 目录中的脚本中设置环境变量。
通过配置文件设置变量的语法与在你的 shell 中设置变量的语法相同
export PATH=$PATH:/snap/bin:/home/seth/bin
关闭当前 shell,或者强制它加载更新后的配置
$ . ~/.bashrc
最后,再次查看你的系统路径
$ echo $PATH
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/snap/bin:/home/seth/bin:/home/seth/.local/bin:/snap/bin:/home/seth/bin
它现在已正确设置为包含你的其他自定义目录。
发现其他环境变量
你可以随意创建和操作环境变量,并且某些应用程序就是这样做的。这个事实意味着你的许多环境变量没有被你的大多数应用程序使用,并且如果你添加你自己的任意变量,那么有些可能根本不会被任何东西使用。所以问题是:你如何找出哪些环境变量是有意义的?
答案在于应用程序的文档。例如,要找出你的通用 Bash 环境可用的选项,你可以阅读 Bash 文档。虽然 Bash 手册页提到了许多重要的变量,但 Bash 的 GNU info 页面列出了两个详尽的 Bourne Shell 和 Bash 环境变量列表,以及每个变量的使用方式。
例如,在 info 页面列表中
'HISTCONTROL'
A colon-separated list of values controlling how commands are saved
on the history list. If the list of values includes 'ignorespace',
lines which begin with a space character are not saved in the
history list. A value of 'ignoredups' causes lines which match the
previous history entry to not be saved. A value of 'ignoreboth' is
shorthand for 'ignorespace' and 'ignoredups'.
[...]
此输出告诉你 HISTCONTROL 环境变量控制你的 Bash 历史记录的呈现方式,以及你可以使用哪些值来自定义该体验。在此示例中,ignoredups 值告诉 history 命令忽略重复行。
你可以轻松地测试这个。首先,连续两次发出相同的命令
$ echo "hello world"
hello world
$ echo "hello world"
hello world
查看你的历史记录,或至少是最近的条目
$ history | tail -5
996 man bash
997 info bash
998 echo "hello world"
999 echo "hello world"
1000 history
你可以看到重复的条目现在确实被列出了。
根据你在 info 页面中读取的内容,在你的 .bashrc 文件中设置一个新的环境变量
export HISTCONTROL=$HISTCONTROL:ignorespace:ignoredups
保存然后加载你的新配置
$ source ~/.bashrc
连续两次发出两个命令
$ echo "hello once"
hello once
$ echo "hello once"
hello once
查看你的历史记录中最近的条目
$ history | tail -5
1000 history
1001 emacs ~/.bashrc
1002 source ~/.bashrc
1003 echo "hello once"
1004 history
由于你的新环境变量,重复的条目现在被折叠为一个条目,正如 info 页面指定的那样。
查找相关的环境变量通常是阅读你想影响的应用程序的文档的问题。大多数环境变量特定于一个应用程序平稳运行所需的内容。对于通用条目,你的 shell 文档是查找的逻辑位置。如果你编写需要新环境变量的脚本或应用程序,请务必在你自己的文档中定义这些变量。
评论已关闭。