我有一个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中的PATH中,但由于没有发生,因此无法访问一堆自定义可执行文件。
我通过以下方式解决了这个问题:
if [ -d ~/bin ] ; then
PATH=~/bin:"$PATH"
fi
这很好用。但我想我只想了解为什么没有设置$ HOME。似乎$HOME
和~
应该大致相同,不是吗?对于如何设置这个环境,我可能从根本上缺少一些东西。
我正在运行Ubuntu 12.04.5,如果这有所不同。
答案 0 :(得分:4)
证据表明,运行Java应用程序的环境中缺少HOME
。假设应用程序未明确取消设置HOME
,最可能的原因是应用程序是从某个上下文启动的,而不是应用程序正在运行的用户的登录。
~
和$HOME
相似是正确的。如果环境中存在HOME
,即使将其设置为空字符串,~
也会替换为$HOME
。但是,如果环境中不存在HOME
,bash
将尝试查找当前登录用户的主目录,并将其用于~
。
例如
$ bash -c 'echo ~'
/home/rici
$ HOME='Hello, world!' bash -c 'echo ~'
Hello, world!
$ HOME= bash -c 'echo ~'
$ (unset HOME; bash -c 'echo ~';)
/home/rici
由于您的解决方法需要等同于上一个方案,因此我得出结论:HOME
尚未设置,或者未设置。