9

这是文件中的一行 ~/.bash_profile

export MESSAGE="Hello World"

我想MESSAGE在java中访问系统变量。

System.getenv("MESSAGE");不起作用。

4

4 回答 4

5

.bash_profile 文件仅用于登录 shell。如果您的 java 进程是从不是登录 shell 的 shell 中生成的(例如#!/bin/sh顶部带有 a 的脚本),那么它将不会读取它(尽管它可能仍会从环境中继承 MESSAGE ,具体取决于您的运行方式)。

另请注意,对于不是“登录”shell 的交互式 shell,也不会运行 .bash_profile,因此即使有 shell 提示,也不能依赖它运行。为此,人们通常使用为所有交互式 shell 提供的 .bashrc。

如果您想在所有 Bourne shell 衍生工具中设置一个变量,无论它们是否是交互式的,请将其放在 .profile 和 .bashrc 中。

于 2012-09-06T16:50:37.097 回答
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 中使用 export 的评论是错误的,你不应该这样做,原因有两个:(1)一个非常微不足道的性能损失,(2)你执行的某些命令很有可能不会获得环境变量 -特别是从您的窗口管理器菜单和其他任何地方都没有出现实际命令提示符的地方产生的东西。

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

另请注意,如果您在 .profile 中设置环境变量,请使用以下语法:

变量=值;导出 VAR

...因为旧的 sh shell 不支持“export VAR=VALUE”。如果我没记错的话,在一堆这些之前使用 set -e 并在之后使用 set +e 可以完全消除使用“导出”的需要。

于 2012-09-06T17:23:11.283 回答
1

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

于 2012-09-06T16:49:19.267 回答
1

另一个要看的地方:/etc/environment(这可能会否决/替换通过 IDE 打开的 shell 中的 .bashrc 或 .bash_profile)

于 2015-08-28T11:25:42.830 回答