我有这个代码,我只想设置一个环境变量:
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
程序进行设置?
答案 0 :(得分:12)
创建新进程时,将复制父进程的环境。新进程中对环境的更改不会影响父进程。修改环境后,您必须让程序启动shell。
答案 1 :(得分:8)
不确定这最终是您想要做的,但它确实会为您提供所要求的结果。
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