在 go 程序退出后,在 shell 上保留为 env 变量设置的值



有没有办法在我的 shell 上设置一个环境变量并在 go 程序退出后让它继续存在?我尝试了以下方法

bash-3.2$ export WHAT=am
bash-3.2$ echo $WHAT
am
bash-3.2$ go build tt.go 
bash-3.2$ ./tt
am
is your name
bash-3.2$ echo $WHAT
am
bash-3.2$ 

代码是:

package main`
import (
        "fmt"
       "os"`
)
func main() {
fmt.Println(os.Getenv("WHAT"))
os.Setenv("WHAT", "is your name")
fmt.Println(os.Getenv("WHAT"))
}

谢谢

不,环境变量只能向下传递,不能向上传递。你正在尝试做后者。

您的流程树:

`--- shell
          `--- go program
          |
          `--- other program

go 程序必须将环境变量传递给 shell,以便其他程序可以访问它。

你可以做的是像ssh-agent这样的程序所做的:返回一个字符串,该字符串可以解释为设置一个环境变量,然后可以由 shell 进行评估。

例如:

func main() {
    fmt.Println("WHAT='is your name'")
}

运行它将为您提供:

$ ./goprogram
WHAT='is your name'

评估打印的字符串将给你所需的效果:

$ eval `./goprogram`
$ echo $WHAT
is your name

No.

进程具有其父环境的副本,并且无法写入父环境。

其他答案是严格正确的,但是您可以自由执行 golang 代码,将环境变量的任意值填充到您的 go 创建的输出文件中,然后返回您执行该 go 二进制文件的父环境,然后获取 go 的输出文件以从您的 Go 代码内部计算可用的 env 变量......这可能是你的 Go 代码 write_to_file.go

package main
import (
    "io/ioutil"
)
func main() {
    d1 := []byte("export whodunit=calculated_in_golangn")
    if err := ioutil.WriteFile("/tmp/cool_file", d1, 0644); err != nil {
        panic(err)
    }
}

现在将上面的 write_to_file.go 编译成二进制write_to_file...这是一个 bash 脚本,可以充当父级来执行上面的二进制文件

#!/bin/bash
whodunit=aaa
if [[ -z $whodunit ]]; then
    echo variable whodunit has no value
else
    echo variable whodunit has value $whodunit
fi
./write_to_file # <-- execute golang binary here which populates an exported var in output file /tmp/cool_file
curr_cool=/tmp/cool_file
if [[ -f $curr_cool ]]; then # if file exists
    source /tmp/cool_file # shell distinguishes sourcing shell from executing, sourcing does not cut a subshell it happens in parent env
fi
if [[ -z $whodunit ]]; then
    echo variable whodunit still has no value 
else
    echo variable whodunit finally has value $whodunit
fi

这是执行上述 shell 脚本的输出

variable whodunit has value aaa
variable whodunit finally has value calculated_in_golang

相关内容

  • 没有找到相关文章

最新更新