有一个script.sh文件
set FABRIC_CFG_PATH=<some path>
set CORE_PEER_LOCALMSPID=<some id>
如果我在 Windows 中运行此脚本,则不会设置环境变量。 而如果使用 cmd 方法设置 env, 例如,在 Windows cmd 上
set FABRIC_CFG_PATH=<some path>
效果很好。
那么如何通过shell脚本文件在windows中设置env呢?
因为您的意图是定义仅当前进程环境变量(而不是持久定义的变量,在Windows上存储在注册表中)您需要使用运行的脚本文件/批处理文件进程内,以便脚本的调用者可以看到其中定义的环境变量。
因此:
如果调用方是
cmd.exe
会话,则必须使用 批处理文件:文件扩展名为 .cmd
的纯文本文件(或者,不太优选,.bat
[1] ) 使用 cmd.exe
语法。
如果调用方是 PowerShell 会话,则必须使用 PowerShell 脚本:文件扩展名为
.ps1
、使用 PowerShell 语法的纯文本文件。
.cmd
文件(批处理文件)(但不能直接反之亦然),但这将不会按预期工作,因为它需要在 (cmd.exe
) 子级中运行 进程,PowerShell 调用者看不到其环境变量。至于
.sh
文件:它们在Windows上没有预定义的含义,但可能由第三方应用程序定义,例如Git Bash。对于后者,调用 .sh
文件将其传递到 POSIX 兼容的 Bash shell,该 shell 有自己的语法。更重要的是,当从 cmd.exe
或 PowerShell调用 时,调用这样的文件将无法按预期工作,因为 Bash 必须在 child 进程中运行,并且子进程无法为其父进程设置环境变量。
cmd.exe
/ 批处理文件示例:
例如,创建一个名为
envVars.cmd
的文件,并将以下行放入其中:
@echo off
:: Note: Do NOT use `setlocal` here
set "FABRIC_CFG_PATH=C:\path\to\some directory\config"
set "CORE_PEER_LOCALMSPID=42"
然后,从您的
cmd.exe
会话/另一个批处理文件中,按如下方式调用该文件,以使环境变量定义对当前进程生效(假设该文件位于当前目录中):
.\envVars.cmd
然后您将能够将新定义的变量引用为
%FABRIC_CFG_PATH%
和 %CORE_PEER_LOCALMSPID%
。
PowerShell 示例:
例如,创建一个名为
envVars.ps1
的文件,并将以下行放入其中:
$env:FABRIC_CFG_PATH='C:\path\to\some directory\config'
$env:CORE_PEER_LOCALMSPID=42
然后,从 PowerShell 会话/另一个 PowerShell 脚本中,按如下方式调用该文件,以使环境变量定义对当前进程生效(假设该文件位于当前目录中):
./envVars.ps1
然后您将能够将新定义的变量引用为
$env:FABRIC_CFG_PATH
和 $env:CORE_PEER_LOCALMSPID
。
[1] 请参阅此答案。
在对Windows中的可执行文件/批处理文件进行一些研究之后,我得出的结论是,我需要编写一个批处理.bat文件来使用set命令来根据需要设置环境变量。