【问题标题】:How to retrieve environment variable of command after run运行后如何检索命令的环境变量
【发布时间】:2020-06-20 08:31:09
【问题描述】:

我在 Go 中通过 exec.Command 运行一个简单的命令。现在我想知道是否可以得到这个进程的所有环境变量。

因为我可以使用它来设置它们:

cmd := exec.Command("bash ./script.sh")
cmd.Dir = filepath.Join(s.Path, "..")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Env = []string{"MY_VAR=some_value"}
err := cmd.Run()

有人知道这是否可能吗?如果这也适用于 Windows/MacOS/Linux

【问题讨论】:

    标签: go environment-variables


    【解决方案1】:

    简短回答:否。

    我讨厌说“不可能”,因为总有一些方法可以做这样的事情(例如,在 Linux 上阅读 /proc/.../environ,在 Windows 中做一些复杂的 ReadProcessMemory 戳, 等等。)。但是,它并不打算这样做,也没有可移植的解决方案。

    环境变量是进程的本地变量,在创建进程时,父进程的环境变量会被继承或您设置的任何内容。但它们并非设计为将数据发送回父进程的机制。

    如果您需要将孩子的信息传达给您的父母,有多种方法可以做到:

    • 您可以将数据发送到stdout 并在父级中捕获它
    • 您可以使用管道/套接字并将相应的句柄作为命令行参数传递
    • 您可以使用共享内存/内存映射文件
    • 您可以在已知位置使用实际文件(不推荐)

    【讨论】:

    • 简短的回答就足够了,因为 OP 的问题显示了对环境变量如何工作和打算使用的基本误解。
    • @cherrydt 感谢您的详细解释。我不知道它是这样设计的。我正在使用 Go 构建一个 CLI,它需要能够运行用户定义的脚本,但我希望这些脚本在同一个进程中运行(以便它们可以共享环境变量)。
    • 在 bash 脚本的情况下,您可以尝试将它们包装在另一个脚本中,该脚本将所有环境变量保存到最后的文件中(或输出它们或以其他方式将它们传回父级),然后是父级可以相应地更新自己的环境变量。
    猜你喜欢
    • 2022-01-08
    • 2021-07-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多