gpt4 book ai didi

go - 是否可以捕获由外部命令设置的环境变量?

转载 作者:数据小太阳 更新时间:2023-10-29 03:23:24 24 4
gpt4 key购买 nike

我有一个脚本(在 Windows 上)可以设置许多环境变量。我想在 Go 中执行这个脚本来为后续调用二进制文件设置环境变量。

像这样:

cmd1 := exec.Command("setup_env.bat")
cmd.Run()

// other_command.exe relies on environment variables
// set by setup_env.bat
cmd2 := exec.Command("some_binary.exe")
cmd2.Env = cmd1.Env
cmd2.Run()

但是这不起作用,因为 cmd1.Env 在调用 cmd1.Run() 后为空(在 cmd1 中设置的环境变量似乎不会传播到 cmd1.Env)。 os.Environ() 在调用 cmd1.Run() 后似乎也不受影响。

如果您对我这样做的原因感到好奇,我正在尝试自动执行通常需要用户调用 setup_env.bat 然后调用 other_command.exe 的任务 在命令提示符中。我没有 setup_env.bat,它可能会经常更改,所以我不能自己在 Go 中设置环境变量。

最佳答案

我设法用下面的代码产生了想要的结果:

cmd := exec.Command("setup_env.bat", "&&", "some_binary.exe")
cmd.Run()

我还发现可以在使用 SET 打印环境后捕获 stdout 来手动解析环境变量。例如:

func getEnv(command string) ([]string, error) {
cmd := exec.Command(command, "&&", "SET")
out, _ := cmd.StdoutPipe()

err := cmd.Start()
if err != nil {
return nil, err
}

rawEnv, _ := ioutil.ReadAll(out)

err = cmd.Wait()
if err != nil {
return nil, err
}

env := strings.Split(string(rawEnv), "\r\n")
return env[:len(env)-1], nil
}

// ...

cmd := exec.Command("some_binary.exe")
env, err := getEnv("setup_env.bat")
if err != nil {
log.Fatal(err)
}
cmd.Env = env // or os.Setenv(...) if you need it in current context
cmd.Run()

关于go - 是否可以捕获由外部命令设置的环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49000797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com