有没有办法在我的 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