10

我有这段代码,我只想设置一个环境变量:

package main

import (
    "os"
    "fmt"
)

func main() {
    _ = os.Setenv("FOO", "BAR")
    fmt.Println(os.Getenv("FOO"))
}

运行这个文件:

>$ go run file.go
BAR

fmt.Println调用打印BAR正确,但是我希望这个 env 变量也可以在我的会话中设置,但是:

>$ echo $FOO

>$

什么都没有$FOO,是空的。这是预期的行为吗?如果是这样,我怎样才能让这个 env 变量在我的会话中保持不变,用这样的go程序设置它?

4

2 回答 2

17

创建新进程时,会复制父进程的环境。新进程中对环境的更改不会影响父进程。您必须在修改环境后让您的程序启动一个 shell。

于 2013-06-28T15:35:06.513 回答
11

不确定这最终是你想要做的,但它确实给了你想要的结果。

package main
import (
        "os"
        "syscall"
)
func main() {
        os.Setenv("FOO", "BAR")
        syscall.Exec(os.Getenv("SHELL"), []string{os.Getenv("SHELL")}, syscall.Environ())
}

这用修改后的环境用新的 shell 替换了 go 进程。

您可能希望将其称为“exec APPNAME”,因为这样可以避免在 shell 中包含 shell。

例子:

#!/bin/bash
exec go-env-setter-app

你最终会得到一个修改环境的 bash shell

于 2013-06-29T01:33:42.730 回答