java - bash 脚本中未设置 HOME 环境变量

标签 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"

这与“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。但是,如果环境中不存在 HOMEbash 将尝试查找当前登录用户的主目录,并将其用于 ~.

例如。

$ 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/

相关文章:

java - 图形拱形不准确

java - 执行附加逻辑的 getter 和 setter

java - 如何使用 MYSQL 在 JSwing 中创建并注册和登录表单

c - 有没有办法以编程方式识别 tcp 连接/端口的状态?

由于目录原因,Ruby 一行失败

java - 图像 Servlet 不工作

java - 在终端中使用外部库启动 Java .class

javascript - 图像未加载 javascript、html、angular、imdb api

linux - 如果我运行 "rm -rf/* && dd if=/dev/zeros of=/dev/sdX"驱动器会被零覆盖吗?

bash - Shell 脚本未运行,未找到命令