环境变量是 Linux、Mac 或 Windows 计算机的全局设置,存储供系统 shell 在执行命令时使用。许多环境变量在安装或用户创建期间默认设置。
例如,当您登录时,您的主目录被设置为环境变量。它在 PowerShell 中的显示方式取决于您的操作系统。
在 Windows 上
PS C:\Users\bogus> Get-Variable HOME -valueOnly
C:\Users\bogus
在 Linux 上
pwsh> Get-Variable HOME -valueOnly
HOME=/home/seth
在 Mac 上
pwsh> Get-Variable HOME -valueOnly
HOME=/Users/bogus
您通常不直接使用环境变量,但各个应用程序和守护程序会在需要时引用它们。但是,当您想要覆盖默认设置,或者当您需要管理系统没有理由自行创建的新设置时,环境变量可能很有用。
本文是关于开源 PowerShell 环境中的环境变量,因此适用于在 Windows、Linux 和 Mac 上运行的 PowerShell。Bash shell 的用户应参考我关于 Bash 环境变量 的文章。
在本文中,我在开源操作系统 Linux 上运行了 PowerShell。无论您使用什么平台,命令都是相同的,尽管输出会有所不同(例如,您的用户名是 seth 的可能性在统计学上很小)。
什么是环境变量?
PowerShell 中的环境变量是特殊类型的变量,它们为系统提供有关操作系统环境的信息。使用环境变量,您可以查看和更改 Windows 注册表中的变量,以及为特定会话设置的变量。
在 PowerShell 中,环境变量存储在 Env: “驱动器”中,可通过 PowerShell 环境提供程序(PowerShell 的一个子系统)访问。这不是物理驱动器,而是虚拟文件系统。
由于环境变量存在于 Env: 驱动器中,因此在引用它们时,您必须在变量名称前加上 Env:。或者,您可以使用 Set-Location 命令将您的工作位置设置为 Env: 驱动器,以便您可以将所有环境变量视为局部变量
PS> Set-Location Env:
PS> pwd
Path
----
Env:/
环境变量向您的计算机传达有关您登录会话的信息。例如,当应用程序需要确定默认情况下将数据文件保存在哪里时,它通常会调用 HOME 环境变量。您可能从未自己设置过 HOME 变量,但它仍然存在,因为大多数环境变量都由您的操作系统管理。
您可以使用 Get-ChildItem 命令从 Env: 驱动器中查看系统上设置的所有环境变量。列表很长,因此通过管道将输出传递给 out-host -paging 以使其易于阅读
PS> Get-ChildItem | out-host -paging
LOGNAME seth
LS_COLORS rs=0:mh=00:bd=48;5;232;38;5;
MAIL /var/spool/mail/seth
MODULEPATH /etc/scl/modulefiles:/etc/scl/modulefiles
MODULESHOME /usr/share/Modules
OLDPWD /home/seth
PATH /opt/microsoft/powershell/6:/usr/share/Modules/bin
PSModulePath /home/seth/.local/share/powershell/Modules
PWD /home/seth
[...]
如果您不在 Env: 驱动器中,那么您可以通过在命令中添加 Env: 来执行相同的操作
PS> Get-ChildItem Env: | out-host -paging
LOGNAME seth
LS_COLORS rs=0:mh=00:bd=48;5;232;38;5;
MAIL /var/spool/mail/seth
MODULEPATH /etc/scl/modulefiles:/etc/scl/modulefiles
可以使用与普通变量相同的一些语法来设置、调用和清除环境变量。与其他变量一样,您在会话期间设置的任何内容仅适用于该特定会话。
如果您想对变量进行永久更改,则必须在 Windows 上在 Windows 注册表中更改它们,或在 Linux 或 Mac 上的 shell 配置文件(例如 ~/.bashrc)中更改它们。如果您不熟悉在 PowerShell 中使用变量,请在继续之前阅读我的 PowerShell 中的变量 文章。
环境变量用于什么?
不同的环境变量被计算机内的几个不同系统使用。例如,您的 PATH 变量对您的 shell 至关重要,但对于 Java 而言,重要性要小得多(Java 也有路径,但它们是重要 Java 库的路径,而不是通用系统文件夹)。但是,USER 变量被几个不同的进程使用,以识别谁在请求服务。
安装向导,例如开源的 Nullsoft Scriptable Install System (NSIS) 框架,会在您安装新应用程序时更新您的环境变量。有时,当您安装操作系统预期工具集之外的东西时,您可能必须自己管理环境变量。或者,您可以选择添加环境变量以满足您的偏好。
它们与普通变量有何不同?
当您创建普通变量时,该变量被认为是局部的,这意味着它在创建它的 shell 之外未定义。
例如,创建一个变量
PS> Set-Variable -Name VAR -Value "example"
PS> gv VAR -valueOnly
example
启动一个新的 shell,即使是从当前 shell 中启动
PS> pwsh
PS c:\> gv VAR -valueOnly
gv : Cannot find a variable with the name 'example'.
另一方面,环境变量旨在具有全局范围。它们独立于创建它们的 shell 存在,并且可供其他进程使用。
如何设置环境变量?
设置环境变量时,您应该通过使用 $Env: 表示法显式地表明它是一个环境变量
PS Env:/> $Env:FOO = "hello world"
PS Env:/> Get-ChildItem FOO
hello world
作为测试,启动一个新会话并访问您刚刚创建的变量。但是,由于该变量是环境变量,因此您必须在其前面加上 $Env:
PS Env:/> pwsh
PS c:\> $Env.FOO
hello world
即使您已使变量可用于子进程,它仍然只是一个临时变量。它可以工作,您可以验证它是否存在,您可以从任何进程中使用它,但是当创建它的 shell 关闭时,它会被销毁。
如何在您的配置文件中设置环境变量?
要强制环境变量跨会话持久存在,您必须将其添加到您的 PowerShell 配置文件中,例如位于 HOME/Documents/Profile.ps1 中的 CurrentUser,AllHosts 配置文件。
PS> Add-Content -Path $Profile.CurrentUserAllHosts -Value '$Env:FOO = "hello world"'
添加此行后,任何启动的 PowerShell 会话都会实例化 FOO 环境变量并将其值设置为 hello world。
目前有六个默认配置文件控制 PowerShell 会话,因此请参阅 Microsoft 开发博客 以获取更多信息。
如何发现新的环境变量?
您可以随意创建和操作环境变量,并且某些应用程序就是这样做的。这一事实意味着您的许多环境变量未被您的大多数应用程序使用,如果您添加自己的任意变量,那么有些变量可能根本不会被任何东西使用。
所以问题是:如何找出哪些环境变量是有意义的?答案在于应用程序的文档。
例如,Python 提供了在安装期间将适当的 Python 路径添加到您的 Path 环境变量。 [注意:PATH?] 如果您拒绝,既然您知道如何修改环境变量,您就可以自己设置该值。
对于您安装的任何应用程序也是如此:安装程序应将适当的变量添加到您的环境中,因此您永远不需要手动修改 Env:。如果您正在开发应用程序,那么您的安装程序也应该为您的用户执行相同的操作。
要发现各个应用程序的重要变量,请参阅其用户和开发人员文档。
评论已关闭。