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

cuxqih21  于 2023-11-14  发布在  Go
关注(0)|答案(3)|浏览(119)

在我将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命令时,更改已经完成。
所有我想要的是改变操作系统代理从去代码没有重新启动系统。
如果有任何其他办法,也请提及。

zkure5ic

zkure5ic1#

但是当我尝试使用env检查我的HTTP_PROXY时,|grep -i代理我没有看到它得到反映。
这是因为环境只在新的会话中重新加载(或者如果您手动获取它)。否则,当前shell的变量保持不变。

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

字符串
这会在子shell中运行命令,其中的更改不会影响父shell。因此,一旦进程退出,更改就会消失。
事实上,根本不可能改变可以影响父进程的环境变量,因为改变只会影响当前/子进程-因此不能改变父进程的环境。

t2a7ltrp

t2a7ltrp2#

当你运行cmd := exec.Command("bash", "-c", "source /etc/environment")时,这将加载env变量,但仅限于由'bash'命令创建的会话,因此不会影响其他会话。
你可以做什么我的2美分:
1.更改上述代码仅更改文件
1.创建一个简单的bash脚本来运行go文件,或者执行编译后的脚本,然后获取/etc/env文件
Bash文件可能是这样的

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

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

uqcuzwp8

uqcuzwp83#

这是一个很常见的问题,我们都想出了一些杂七杂八的解决方法,比如重新启动进程,或者在二进制文件周围使用 Package 脚本。
从不同的Angular 来看,建议使用godotenvhttps://github.com/joho/godotenv(我不认为我能比项目自己的README更好地总结godotenv)
本质上godotenv解析环境变量,并使它们在 * 当前 * go进程中处于活动状态。是的,它是解析。但如果你有不想脚本 Package 和重启的进程,它就是答案。
godotenv有相当大的用户群,所以它处理任何解析边缘情况比DIY尝试更好。

相关问题