在golang中重用流程以持久化环境变量

在golang中重用流程以持久化环境变量,go,environment-variables,Go,Environment Variables,我目前正努力在golang中重用流程 更多背景: 我正在构建的CLI将在开发中使用,因此将使用CLI来设置开发环境,通过支持这种开箱即用的方式简化部署/构建和测试。为了使CLI灵活,我希望用户能够集成自定义脚本。例如,一个脚本覆盖docker环境变量,以便CLI部署脚本部署到正确的环境。使用以下命令公开这些环境:minikube docker env此脚本将export语句打印到stdout。通常,您会运行eval$(minikube docker env)将这些环境变量应用于当前shell。但

我目前正努力在golang中重用流程

更多背景: 我正在构建的CLI将在开发中使用,因此将使用CLI来设置开发环境,通过支持这种开箱即用的方式简化部署/构建和测试。为了使CLI灵活,我希望用户能够集成自定义脚本。例如,一个脚本覆盖docker环境变量,以便CLI部署脚本部署到正确的环境。使用以下命令公开这些环境:
minikube docker env
此脚本将
export
语句打印到
stdout
。通常,您会运行
eval$(minikube docker env)
将这些环境变量应用于当前shell。但我希望我的CLI能够跨脚本共享这些变量

现在假设我定义了两个命令<代码>A和
B
。这两个命令都是简单的bash脚本。但可以在模式或python内部运行

脚本
A

export FOO="bar"
脚本
B

echo $FOO
这两个脚本的执行方式如下:

cmd := exec.Command(bash, [PATH_TO_SCRIPT])
stdout, err := cmd.Output()
我想实现的是,有一个过程可以执行这些脚本,但我很难找到一种方法


我希望通过自己定义的脚本实现这一点的原因是CLI的用户可以轻松地添加脚本并在以后使用这些环境变量。

除了:不可能之外,没有其他答案。这是因为您的问题涉及到对UNIX环境变量如何工作以及Go语言
exec.Command()
函数如何工作的基本误解。进程无法修改其父进程的环境变量;或任何其他程序。Go lang
exec.Command()
调用启动一个新进程,该进程不会影响执行该操作的进程的环境变量。您需要重新思考您的体系结构。

您不能从围棋或任何语言中这样做。一个进程可以通过执行二进制文件来分叉另一个进程;进程在二进制文件退出时结束。@Adrian您还有其他可行的解决方案吗?如果没有上下文的详细信息,很难说。。。您可以编写第三个包装器脚本来运行另外两个,或者您可以通过多种方式指定脚本外部的环境变量。我可以提供更多的上下文:我正在构建的CLI将在开发中使用,将使用CLI来设置开发环境,通过支持这种开箱即用的方式简化部署/构建和测试。为了使CLI灵活,我希望用户能够集成自定义脚本。例如,一个脚本覆盖docker环境变量,以便CLI部署脚本部署到正确的环境。我认为对两个脚本使用相同的过程是可能的。是否可以创建一个shell实例?为什么要使用脚本覆盖环境变量?正常使用它们不是更好吗,或者在用户配置文件中设置,或者使用
env
?为什么这需要从Go执行如此多的bash呢?我认为最好使用all bash或all Go,而不是将两者混合使用。感谢您的反馈和解释UNIX环境变量是如何工作的。您有什么建议吗?@toonvanstrijp通常您会让子脚本编写语句,如
export A=x
to stdout。然后父脚本使用
eval$(子脚本)
执行它。一种非常危险的做法。您也可以使用Go编写程序,解析输出,识别此类赋值,并将其转换为
os.Setenv()
Go函数调用。话虽如此,我不明白您为什么选择这种体系结构,因此无法提供一个好的答案。我在上面的问题中添加了更多的上下文。如果您认为我的架构决策不正确或认为有更好的方法,请告诉我。答案的措辞有点奇怪,因此我想澄清一下-Go可以为从
exec.Command.Env
:@AdrianYes开始的流程设置环境变量,但这不是提问者试图做的。他们希望由
exec.Command()
启动的进程修改Go进程的环境。