为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕尼黑5688855 2021-12-27 10:41:18
有没有办法可以在我的 shell 上设置一个环境变量并让它在 go 程序退出后保持不变?我尝试了以下bash-3.2$ export WHAT=ambash-3.2$ echo $WHATambash-3.2$ go build tt.go bash-3.2$ ./ttamis your namebash-3.2$ echo $WHATambash-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"))}谢谢
查看完整描述

3 回答

?
萧十郎

TA贡献1815条经验 获得超12个赞

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


您的流程树:


`--- 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


查看完整回答
反对 回复 2021-12-27
?
噜噜哒

TA贡献1784条经验 获得超7个赞

不。

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


查看完整回答
反对 回复 2021-12-27
?
守着一只汪

TA贡献1872条经验 获得超3个赞

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


package main


import (

    "io/ioutil"

)


func main() {


    d1 := []byte("export whodunit=calculated_in_golang\n")

    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


查看完整回答
反对 回复 2021-12-27
  • 3 回答
  • 0 关注
  • 183 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信