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
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
- 3 回答
- 0 关注
- 183 浏览
添加回答
举报