【发布时间】:2014-10-16 01:18:59
【问题描述】:
我有一个 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,如果这有什么不同的话。
【问题讨论】:
-
冒着繁琐的风险,在您的 Java 应用程序中,您确定创建 ProcessBuilder 实例之前的环境包含 HOME?如果您在 Java 行之前检查 System.getenv() 内容,它会显示什么?
-
@John1024:不完全是。 Posix 要求 系统(不是 shell)在 login(不是在启动时)设置
HOME环境变量。它通常由login程序或等效程序设置。见man login