【问题标题】:pass ENV VAR to exec.Command?将 ENV VAR 传递给 exec.Command?
【发布时间】:2016-12-14 01:00:36
【问题描述】:

我正在为流行的命令行工具(ansible-playbook)编写一个 go 包装器,我需要通过 exec.Command 调用传递一个参数。 bash 等价物是:

MY_VAR=some_value ansible-playbook -i custom-inventory playbook.yml

以前我只是使用 os.Setenv 导出 MY_VAR,但这会导致 playbook 的并行执行出现问题。所以我想在命令前面传递 var,以便每个调用都有它自己的这个 var 的值。

我不确定如何使用 exec.Command 执行此操作,因为该函数的第一个参数是“命令”。有什么建议吗?

edit:我尝试使用 Cmd 结构的 Env 字段,但这会覆盖所有环境变量。我有大量的配置集,我只想覆盖这个特定的环境变量。这不可能吗??

【问题讨论】:

    标签: go


    【解决方案1】:

    对于那些想知道解决方案的人:

        cmd := exec.Command("ansible-playbook", args...)
        cmd.Env = os.Environ()
        cmd.Env = append(cmd.Env, "MY_VAR=some_value")
    

    将保留现有环境,然后写入您想要的一个值。

    感谢 godoc 和开源!

    【讨论】:

    • 请注意,这将覆盖当前进程环境中已经存在的任何MY_VAR。如果这是您的意图,那么此解决方案可以正常工作。
    • 否则,您可能希望将append() 行包含在if _, ok := os.LookupEnv("MY_VAR"); !ok { ... } 之类的东西中
    • 就我个人而言,我会复制 os.Environ 切片而不是在没有深复制的情况下追加。也许它今天可以工作,但我不喜欢通过不同的名称附加到同一个切片。
    • 我不认为这是真的,os.Environ() 返回一个新切片。这应该是安全的
    猜你喜欢
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2015-05-08
    • 2021-08-30
    • 2020-05-01
    相关资源
    最近更新 更多