Java bash脚本中未设置主环境变量
我有一个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
$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