使用“ os”程序包设置后,未在终端会话上设置环境变量

I have this code where I just want to set a environment variable:

package main

import (
    "os"
    "fmt"
)

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

Running this file:

>$ go run file.go
BAR

The fmt.Println call prints BAR correctly, but then I expected this env variable to be set on my session as well, however:

>$ echo $FOO

>$

There's nothing on $FOO, it is empty. Is this a expected behavior? If so, how can I make this env variable to persist on my session setting it with a go program like this?

When a new process is created, the environment of the parent process is copied. Changes to the environment in the new process do not affect the parent process. You would have to have your program start a shell after modifying the environment.

Not sure this is ultimately what you want to do, but it does give you the result you asked for.

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

This replaces the go process with a new shell with the modified environment.

You probably would want to call it as "exec APPNAME", as that will avoid having a shell in a shell.

example:

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

you will end up with a bash shell with the modified environment