System.getenv无法获取在~/.bash_profile中定义的变量

9

以下是文件~/.bash_profile中的一行:

export MESSAGE="Hello World"

我想在Java中访问系统变量MESSAGE

System.getenv("MESSAGE"); 不能工作。


2
在运行 Java 之前,执行 echo $MESSAGE 来确保环境变量已定义。 - pb2q
5个回答

6
.bash_profile文件仅在登录shell中被调用。如果您的java进程是从非登录shell(例如在顶部有“#!/bin/sh”的脚本)派生的,则不会读取它(尽管根据您运行它的方式,它仍可能继承MESSAGE环境变量)。同时请注意,即使对于不是“login” shell 的交互式 shell,.bash_profile也不会运行,因此您不能依赖它即使有一个shell提示符时也被运行。人们通常使用.bashrc来实现这个目的,因为.bashrc用于所有交互式shell。如果您希望在所有Bourne shell派生的情况下设置一个变量,无论它们是否为交互式,请将其放入.profile和.bashrc中。

1

另一个需要查看的地方是:/etc/environment(这可能会在通过IDE打开的shell中覆盖/替换您的.bashrc或.bash_profile)


1
我建议您按照上面建议的方法使用echo $MESSAGE来测试您的环境变量是否确实“已定义”。
此外,更改bash_profile文件不会影响您当前的shell,您必须使用“source”才能使其影响您当前的shell。
我还建议阅读this关于bashrc和bash_profile之间差异的文章。
也许您应该在bashrc中定义EXPORT?

1

对于那些有 .profile 文件(用于旧的 Bourne shell)的用户来说,这实际上变得更加有趣,因为 .bash_profile 会自动读取它(提供兼容性)。在任何一种情况下,环境变量只在登录 shell 启动时读取一次,并且所有子 shell 都可以免费继承这些变量。.bashrc 用于 tty 相关的事情和不可继承的东西,例如函数(旧的 sh 如果设置了 $ENV,则会使用它进行类似的操作)。

您对 ~/.bash_profile 的使用看起来很好(尽管单引号比双引号更可靠,后者允许一些替换)。确保在编辑该文件并尝试测试之间已注销并重新登录,或者使用“.~/.bash_profile”(没有引号并注意前导点和空格,因为这里是命令中的点)。

该文章http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html涵盖了一些好的内容,比如在你的~/.bash_profile末尾使用“. ~/.bashrc”(除非你应该使用-r而不是-f)。有关在.bashrc中使用导出的评论是错误的,你不应该这样做,有两个原因:(1)一个相当微不足道的性能惩罚,(2)一个相当高的机会,你执行的某些命令不会获得环境变量-特别是从窗口管理器菜单和其他地方生成的东西,在它们的父级中没有出现任何实际的命令提示符。

最后,请确保$ MESSAGE实际存在于您的环境中-查看“env”命令的输出-如果它不存在,则Java进程将无法看到它,除非它在内部创建并存储在其自己的内部副本中的环境变量中。

另一个注意事项,如果您在.profile中设置env变量,请使用以下语法:

VAR=VALUE; export VAR

由于旧的sh shell不支持“export VAR = VALUE”,因此在一堆这些命令之前使用set -e,然后在set +e之后可以完全消除使用“export”的需要,如果我记得正确的话。


1

在这里输入图片描述

您的bash配置文件中的变量只会在当前终端会话中使用,因此IntelliJ不会检测到它们。

相反,请转到Run Configurations框中的Edit Configurations,并在environment variables框中添加用分号分隔的环境变量列表!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接