我有一个 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,如果这会有所不同的话。
最佳答案
证据表明 HOME
在运行 Java 应用程序的环境中缺失。假设该应用没有显式取消设置 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
尚未设置或已取消设置。
关于java - bash 脚本中未设置 HOME 环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26394737/