在我将环境变量写入 /etc/enviornment 文件之后,我已经尝试了我的 go 代码中的源命令。下面是示例代码。package mainimport ( "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) }}它返回任何错误但是当我尝试在使用中检查我的 HTTP_PROXY 时,env | grep -i proxy我没有看到它得到反映。我只能在重新启动系统或从另一个终端再次运行 source 命令时才能看到更改已完成。我想要的只是在不重新启动系统的情况下从 go 代码更改 os 代理。如果有任何其他方法,请同时提及。
2 回答
侃侃尔雅
TA贡献1801条经验 获得超15个赞
但是当我尝试使用 env | 检查我的 HTTP_PROXY 时 grep -i proxy 我没有看到它得到反映。
这是因为环境仅在新会话中重新加载(或者如果您手动获取它)。否则,当前 shell 的变量保持不变。
cmd := exec.Command("bash", "-c", "source /etc/environment")
这会在子 shell 中运行命令,并且其中的更改不会影响父 shell。因此,一旦进程退出,更改就会消失。
实际上,根本不可能更改可能影响父进程的环境变量,因为更改只会影响当前/子进程 - 因此无法更改父进程的环境。
杨魅力
TA贡献1811条经验 获得超6个赞
当您运行时cmd := exec.Command("bash", "-c", "source /etc/environment")
,它将加载环境变量,但仅限于由“bash”命令创建的会话,因此不会影响其他会话。
你可以用我的 2 美分做什么:
改变上面的代码只是为了改变文件
创建一个简单的 bash 脚本来运行您的 go 文件或执行已编译的文件,然后获取 /etc/env 文件
Bash 文件可能是这样的
#! /bin/bash go run your_change_envfile.go source /etc/environment
然后只需运行 bash 文件,不要忘记在 bash 上 chmod+x 以便它可以执行。
- 2 回答
- 0 关注
- 193 浏览
添加回答
举报
0/150
提交
取消