从Java progam运行Shell脚本时不拾取环境变量

从Java progam运行Shell脚本时不拾取环境变量,java,linux,bash,shell,unix,Java,Linux,Bash,Shell,Unix,我有一个执行shell脚本的java程序。shell脚本中包含许多环境变量$HOME。从shell执行命令时,它工作正常。echo$HOME提供了该命令的实际路径。脚本更改路径并从更改的路径执行命令 $cat nightly.sh #!/bin/bash ... echo $HOME ... echo "end of script" 我在适当的地方从shell执行时看到/home/when 现在我从java程序调用相同的shell脚本 static Proces p; ... Runtime

我有一个执行shell脚本的java程序。shell脚本中包含许多环境变量$HOME。从shell执行命令时,它工作正常。echo$HOME提供了该命令的实际路径。脚本更改路径并从更改的路径执行命令

$cat nightly.sh

#!/bin/bash
...
echo $HOME
...
echo "end of script"
我在适当的地方从shell执行时看到/home/when

现在我从java程序调用相同的shell脚本

static Proces p;
...
Runtime instance = Runtime.getRuntime();                
p = instance.exec(nightly.sh + " " + branch + " " + stack + " " + profile, null, new File(/home/bmanoj/fps/workspaces/APRIL14REL1/testing/integration-tests/regressions));
现在,我将shell的输出捕获到一个外部文件。当我看到echo$HOME文件时,结果是一个空行。为此,我正在基于$HOME变量构建许多相对路径。所以剧本里没有什么适合我的了


为什么会这样?为什么java程序调用的实例没有拾取环境变量?要在脚本从java程序在shell上执行时精确模拟脚本,必须做什么?

环境变量属于运行程序的用户。哪个用户正在运行您的Java程序?您是如何运行Java程序的?手动?来自cron?来自web请求?您正在将null作为环境传递,因此希望子流程继承当前流程的环境,请先检查变量是否存在于当前流程中。不要使用Runtime.exec,而是使用ProcessBuilder类来执行shell脚本。您的环境变量将在ProcessBuilder环境中自动设置。有关如何使用该程序,请参阅此处的相关内容。该程序现在正在运行,没有任何用户。i、 没有人。这就是原因吗@马塞尔