【问题标题】:Getting correct environment variables获取正确的环境变量
【发布时间】: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 它没有不行。

我通过获取$PATHos.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


【解决方案1】:

您看到的问题是因为通常在 GUI 中双击程序运行程序时,PATH 环境变量设置为默认值。但是,当您的程序在终端中运行时,它会从终端继承 PATH 值。

这里要做的是始终使用PATH 并让用户在他们想要不同的行为时适当地配置他们的 GUI 会话。人们一直在设置不同的PATH 值,有时只是通过更改目录,而您无法从用户的 shell 配置中知道用户希望它猜测什么。

此外,即使您想调用用户的 shell,它也不总是 bash(我使用 zsh),也不总是符合 POSIX 的 shell(例如,tcshfish 等),因此没有一组命令可以调用SHELL 中的程序,而这些命令总是会产生正确的结果。

如果您的程序确实需要从终端运行,那么您应该发送一个.desktop 文件,表明它应该从终端运行,然后会生成一个。否则,要么指定一个允许用户覆盖搜索的命令行选项,要么像其他程序一样使用PATH

【讨论】:

  • 有道理。现在,我已经找到了一种方法来进行某种配置,当which 无法避免使用$PATH 时,该配置允许回退,所以感谢您的提示!我现在接受你的回答,以后可能会改变,以防有人想出一种神奇的方法来找到终端的相同 $PATH 尽管可能有不同的外壳(但正如你让我注意到的那样,这似乎不太可能...... )
猜你喜欢
  • 2018-12-25
  • 2021-11-14
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多