我有一个脚本(在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,而且它可能经常变化,所以我不能自己设置环境变量。
发布于 2018-02-28 01:49:50
我设法用以下代码生成了所需的结果:
cmd := exec.Command("setup_env.bat", "&&", "some_binary.exe")
cmd.Run()我还发现,在用stdout打印环境之后,可以通过捕获SET来手动解析环境变量。例如:
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()https://stackoverflow.com/questions/49000797
复制相似问题