11

我可以通过RunTime类运行 Linux 命令。有没有办法以编程方式从 Java 设置 Linux 全局环境?

我想通过 Java 模拟以下 Linux 命令语句

root@machine:/tmp# export TEST=v2

我使用了 ProcessBuilder 如下,但 TEST 变量没有改变。

ProcessBuilder pb = new ProcessBuilder("/bin/bash","-c","export TEST=v3" + "&& exec");

更新:实际上我的最终目标是使用 EMAIL_NAME 环境作为电子邮件地址,当我的应用程序和机器都启动并停止时,这些操作将发送到 EMAIL_NAME。在那种情况下,我知道不可能在纯 Java 代码上设置 linux 全局环境。所以我有一个解决方法是 EMAIL_NAME 将保存在一个文件中,它将由 linux 脚本或 java 代码更新或读取。

4

4 回答 4

10

环境变量在设置时仅可用于由设置变量的进程生成的进程,因此如果您真的要求设置一个会影响整个系统的变量,那么不。在 Linux 中,您根本无法以交互方式真正做到这一点。您可以做的最好的事情是更改系统启动文件之一以包含所述变量,以便您将来执行的任何操作都将包含该变量。

如果您只是想通过一些变量集运行多个进程,那么ProcessBuilder允许您为使用它生成的进程设置环境。为多个进程重用一个环境是非常简单的。

于 2012-12-24T14:22:10.350 回答
3

当您说“Linux 全局环境”时,您是指 Linux 环境变量吗?如果是这样,我认为答案是否定的。因为这不是java问题。当一个进程设置环境变量时,它只能影响它自己和它的子进程。

于 2012-12-24T14:24:59.253 回答
3

您可以通过 java 将变量更新到 /etc/profile

if(System.getProperty("TEST", "").equalsIgnoreCase(""))
{
    Runtime.getRuntime().exec(new String[]{"bash","-c" ,"echo 'export TEST=v2' >> /etc/profile"}) ;

    /// Also update the System Variable for current process
    System.setProperty("TEST","v2") ;
}

这将从下次登录或您明确来源时生效。

于 2012-12-24T15:04:30.743 回答
-2

我在 bash 中使用这行代码

echo -e PATH=\"/usr/lib/jvm/java-7-openjdk-i386/bin:\$PATH\" >> $HOME/.profile

with 连接本地用户的路径

于 2012-12-24T14:23:53.877 回答