从golang代码中重新加载或源代码/etc/environment文件



在将env变量写入/etc/environment文件后,我尝试了go代码中的源命令。

下面是示例代码。

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时,我没有看到它被反映出来。只有当它重新启动系统或从另一个终端再次运行源命令时,我才能看到更改完成。

我只想在不重新启动系统的情况下更改go代码中的os代理。

如果对此还有其他方法,请同时提及。

但是当我尝试使用env|grep-i代理检查HTTP_PROXY时,我没有看到它被反映出来。

这是因为环境只在新会话中重新加载(或者如果您手动获取它(。否则,当前shell的变量保持不变。

cmd := exec.Command("bash", "-c", "source /etc/environment")

这会在子shell中运行命令,其中的更改不会影响父shell。因此,一旦流程退出,变化就会消失。

事实上,根本不可能更改可能影响父进程的环境变量,因为更改只会影响当前/子进程,因此无法更改父进程的"环境"。

当您运行cmd := exec.Command("bash", "-c", "source /etc/environment")时,这将加载env变量,但仅限于由'bash'命令创建的会话,因此不会影响其他会话。

每我2美分你能做什么:

  1. 更改以上代码仅用于更改文件
  2. 创建一个简单的bash脚本来运行go文件或执行编译后的文件,然后获取/etc/env文件

Bash文件可能类似于这个

#! /bin/bash
go run your_change_envfile.go
source /etc/environment

然后只需运行bash文件,不要忘记在bash上使用chmod+x,这样它就可以执行了。

最新更新