这里有一个 script.sh 文件。
set FABRIC_CFG_PATH=<some path>
set CORE_PEER_LOCALMSPID=<some id>
如果我在Windows上运行此脚本,则环境变量不会被设置。然而,如果使用cmd方法来设置环境变量,例如在Windows上的cmd中输入“set FABRIC_CFG_PATH = ”,则可以正常工作。那么如何通过shell脚本文件在Windows中设置环境变量呢?
这里有一个 script.sh 文件。
set FABRIC_CFG_PATH=<some path>
set CORE_PEER_LOCALMSPID=<some id>
由于你的意图是定义仅在当前进程中有效的环境变量(而不是持久定义的环境变量,这些变量在Windows上存储在注册表中),因此你需要使用一种在进程中运行的脚本文件/批处理文件,以便在其中定义的环境变量能被脚本的调用者看到。
因此:
如果调用者是cmd.exe
会话,则必须使用批处理文件:一个命名为.cmd
(或不太可取的是.bat
[1])的纯文本文件,它使用cmd.exe
语法。
如果调用者是PowerShell会话,则必须使用PowerShell脚本:一个命名为.ps1
的纯文本文件,它使用PowerShell语法。
.cmd
文件(批处理文件),但不能直接反之亦然,因为执行它的必要过程中会创建一个(cmd.exe
)子进程,该子进程的环境变量不会被PowerShell调用者看到。至于.sh
文件:它们在Windows上没有预定义的含义,但可能被第三方应用程序定义,例如Git Bash。对于后者,在调用.sh
文件时会将其传递给POSIX兼容的Bash shell,其具有自己的语法。更重要的是,在从cmd.exe
或PowerShell中调用此类文件时,调用将无法按预期运行,因为Bash必须在一个子进程中运行,而子进程不能设置其父进程的环境变量。
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] 请参考这个答案。
.sh
/批处理文件混淆以及您要实现什么:进程级与持久性环境变量,谁预计会看到这些变量。 - mklement0