【发布时间】:2021-02-11 23:49:16
【问题描述】:
我正在编写一个 go 实用程序,它需要使用命令 which 来获取有关程序是否在 $PATH 中的信息,但我注意到虽然我的程序在从终端启动时可以工作,但它不会双击打开就不行了。
我使用的代码非常简单:
wichJavaOutput, err := Command("which", "java").CombinedOutput()
if err != nil {
return err.Error(), err
}
问题是这只能部分起作用,如果通过包管理器安装 java 并且它位于一个公共文件夹中,它可以很容易地找到它,但它是手动安装 java 并添加到 ~/.bashrc 或 ~./profile 它没有不行。
我通过获取$PATH 和os.Getenv 进行了一对测试,显然......
如果我通过终端启动程序,$PATH 也包含来自~/.bashrc 和~./profile 的部分,但是如果我通过双击启动它,它会找到$PATH 的所有部分,除了这两个文件中的部分,考虑到它可能是加载~/.bashrc 和~./profile 的shell,这有点道理,所以我很难尝试做/bin/sh -c which java 或/bin/bash -c which java 可以工作,但这也不起作用,所以问题来了:
如何在 GO 中获取环境变量并在终端中获得正确的环境变量?
【问题讨论】:
-
Command("source ./bashrc && which", "java") 的一些变体或将环境设置放在名为 which.sh 之类的脚本中,然后让脚本设置环境,然后叫“哪个”。
-
@NicholasRees 不得不对其进行一些编辑,我现在正在使用 exec.Command("bash", "-c", "source ~/.bashrc ; which java") 和...成功了,谢谢!
-
好交易。很高兴这有效。现在我不必启动我的 golang 环境来自己弄清楚语法。 ;)
-
此外,请参阅下面的 cmets,了解如何使其比您的个人外壳和设置更便携。不清楚你这样做是否不仅仅是为了你。
标签: linux shell go environment-variables