在我将env变量写入/etc/environment文件之后,我已经从我的go代码中尝试了source命令。
下面是示例代码。
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"os/exec"
"strings"
)
func main() {
address := "localhost:9090"
file, err := os.OpenFile("/etc/environment", os.O_RDWR, 0644)
defer file.Close()
if err != nil {
panic(err)
}
input, err := ioutil.ReadAll(file)
if err != nil {
log.Fatalln(err)
}
lines := strings.Split(string(input), "\n")
for i, line := range lines {
if strings.Contains(line, "HTTP_PROXY") {
lines[i] = "HTTP_PROXY=" + address
} else {
if i == (len(lines) - 1) {
lines[i] = "HTTP_PROXY=" + address
}
}
}
output := strings.Join(lines, "\n")
err = ioutil.WriteFile("/etc/environment", []byte(output), 0644)
if err != nil {
log.Fatalln(err)
}
cmd := exec.Command("bash", "-c", "source /etc/environment")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err = cmd.Run()
fmt.Println("cmd=================>", cmd, err)
if err != nil {
fmt.Println(err)
}
}
字符串
它不会返回任何错误
但是当我尝试使用env | grep -i proxy
检查我的HTTP_PROXY时,我没有看到它被反射。我只能看到当它重新启动系统或从另一个终端再次运行source命令时,更改已经完成。
所有我想要的是改变操作系统代理从去代码没有重新启动系统。
如果有任何其他办法,也请提及。
3条答案
按热度按时间zkure5ic1#
但是当我尝试使用env检查我的HTTP_PROXY时,|grep -i代理我没有看到它得到反映。
这是因为环境只在新的会话中重新加载(或者如果您手动获取它)。否则,当前shell的变量保持不变。
字符串
这会在子shell中运行命令,其中的更改不会影响父shell。因此,一旦进程退出,更改就会消失。
事实上,根本不可能改变可以影响父进程的环境变量,因为改变只会影响当前/子进程-因此不能改变父进程的环境。
t2a7ltrp2#
当你运行
cmd := exec.Command("bash", "-c", "source /etc/environment")
时,这将加载env变量,但仅限于由'bash'命令创建的会话,因此不会影响其他会话。你可以做什么我的2美分:
1.更改上述代码仅更改文件
1.创建一个简单的bash脚本来运行go文件,或者执行编译后的脚本,然后获取/etc/env文件
Bash文件可能是这样的
字符串
然后运行bash文件,不要忘记在bash上使用chmod+x,这样它就可以被执行了。
uqcuzwp83#
这是一个很常见的问题,我们都想出了一些杂七杂八的解决方法,比如重新启动进程,或者在二进制文件周围使用 Package 脚本。
从不同的Angular 来看,建议使用
godotenv
:https://github.com/joho/godotenv(我不认为我能比项目自己的README更好地总结godotenv)本质上godotenv解析环境变量,并使它们在 * 当前 * go进程中处于活动状态。是的,它是解析。但如果你有不想脚本 Package 和重启的进程,它就是答案。
godotenv有相当大的用户群,所以它处理任何解析边缘情况比DIY尝试更好。