PowerShell 中的环境变量

通过环境变量提升您的 PowerShell 技能,这是“Shell 中的变量”迷你系列的第 2.5 部分。
112 位读者喜欢这篇文章。
hands programming

WOCinTech Chat。由 Opensource.com 修改。CC BY-SA 4.0

环境变量是 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:。如果您正在开发应用程序,那么您的安装程序也应该为您的用户执行相同的操作。

要发现各个应用程序的重要变量,请参阅其用户和开发人员文档。

接下来阅读

PowerShell 中的变量

在我们的迷你系列“Shell 中的变量”中,学习如何在 PowerShell 中处理局部变量。

(团队,红帽)
2019 年 8 月 29 日
标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,并且经常同时从事这两个行业。

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.