【问题标题】:HOME environment variable not set in bash script未在 bash 脚本中设置 HOME 环境变量
【发布时间】: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

标签: java linux bash shell


【解决方案1】:

有证据表明,运行 Java 应用程序的环境中缺少 HOME。假设应用程序没有明确地取消设置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 尚未设置或未设置。

【讨论】:

    猜你喜欢
    • 2013-11-15
    • 2016-10-07
    • 2021-08-29
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 2023-02-06
    • 2011-07-23
    • 2019-08-17
    相关资源
    最近更新 更多