Java bash脚本中未设置主环境变量

Java bash脚本中未设置主环境变量,java,linux,bash,shell,Java,Linux,Bash,Shell,我有一个Java程序,它生成一个调用另一个脚本的bash脚本。在第二个脚本中,我发现未设置$HOME变量。以下是它的要点: 在Java中: Process p = new ProcessBuilder("bash", "-l", "/foo/a.sh").start(); // code to actually execute p /foo/a.sh: #!/bin/bash /foo/b.sh /foo/b.sh: #!/bin/bash echo "HOME=$HOME" 这与“HOM

我有一个Java程序,它生成一个调用另一个脚本的bash脚本。在第二个脚本中,我发现未设置
$HOME
变量。以下是它的要点:

在Java中:

Process p = new ProcessBuilder("bash", "-l", "/foo/a.sh").start();
// code to actually execute p
/foo/a.sh:

#!/bin/bash
/foo/b.sh
/foo/b.sh:

#!/bin/bash
echo "HOME=$HOME"
这与“HOME=”相呼应。最终的问题是,
$HOME/bin
应该被添加到~/.profile中的我的路径中,但由于没有这样做,大量自定义可执行文件无法访问

我通过以下方式解决了这个问题:

if [ -d ~/bin ] ; then
    PATH=~/bin:"$PATH"
fi
这很好。但我想我只是想了解为什么没有设置$HOME。看起来,
$HOME
~
应该大致相当,不是吗?关于这个环境是如何建立的,我可能从根本上缺少一些东西


如果有区别的话,我正在运行Ubuntu 12.04.5。

证据表明运行Java应用程序的环境中缺少
HOME
。假设应用程序没有显式取消设置
主页
,最可能的原因是应用程序是从某个上下文启动的,而不是由运行应用程序的用户登录

正确的是,
~
$HOME
是相似的。如果环境中存在
HOME
,即使将其设置为空字符串,
~
也将替换为
$HOME
。但是,如果环境中不存在
HOME
bash
将尝试查找当前登录用户的主目录,并将其用于
~

例如


由于您的解决方案需要与上一个场景相同的解决方案,因此我得出的结论是,
HOME
尚未设置或未设置。

证据表明运行Java应用程序的环境中缺少
HOME
。假设应用程序没有显式取消设置
主页
,最可能的原因是应用程序是从某个上下文启动的,而不是由运行应用程序的用户登录

正确的是,
~
$HOME
是相似的。如果环境中存在
HOME
,即使将其设置为空字符串,
~
也将替换为
$HOME
。但是,如果环境中不存在
HOME
bash
将尝试查找当前登录用户的主目录,并将其用于
~

例如


由于您的解决方案需要与上一个场景相同的解决方案,因此我认为,
HOME
尚未设置或未设置。

在Java应用程序中,您确信在创建ProcessBuilder实例之前的环境包含HOME吗?如果您在Java代码行之前检查System.getenv()内容,它会显示什么?@John1024:不太清楚。Posix要求系统(不是shell)在登录时(不是在启动时)设置
HOME
环境变量。它通常由
登录
程序或等效程序设置。请参见
man login
冒着繁琐的风险,在Java应用程序中,您确定在创建ProcessBuilder实例之前的环境包含HOME吗?如果您在Java代码行之前检查System.getenv()内容,它会显示什么?@John1024:不太清楚。Posix要求系统(不是shell)在登录时(不是在启动时)设置
HOME
环境变量。它通常由
登录
程序或等效程序设置。请参见
man登录
$ bash -c 'echo ~'
/home/rici
$ HOME='Hello, world!' bash -c 'echo ~'
Hello, world!
$ HOME= bash -c 'echo ~'

$ (unset HOME; bash -c 'echo ~';)
/home/rici