如何在 MacOS 中为 sudo 设置环境变量?

如何在 MacOS 中为 sudo 设置环境变量?

我已在我的计算机上安装了 ServiceMix,并正在尝试启动它。启动脚本称为start.sh。当我这样做时./start.sh,它给了我一条“权限被拒绝”消息。所以我使用了sudo ./start.sh,它可以很好地启动服务器。

然而,当我想使用Java 6(出于各种原因)时,它似乎正在使用Java 7。我查看了start.sh脚本,发现它使用了该JAVA_HOME变量。所以我将 JAVA_HOME 设置为 JDK 6 目录。

不过,ServiceMix 仍然使用 Java 7。

Google 搜索显示,当使用 sudo 运行命令时,sudo 会删除某些环境变量。所以我做了sudo -E ./start.sh。它再次使用 JDK 7。

我打开start.sh并添加一行,echo $JAVA_HOME看看变量是否设置正确。的输出echo是一个空行。

我尝试修改 /etc/sudoers 文件以包含Defaults env_keep += "JAVA_HOME"。执行 start.sh 现在告诉我我的 echo 语句再次是一行空行。ServiceMix 仍然使用 JDK 7。

我尝试在/etc/profile.现在执行 start.sh 告诉我,我的 echo 语句又是一个空行。同样,ServiceMix 使用 JDK 7。

我在这里犯了什么错误?

FWIW,我使用的是 Mac OS X 10.8.2。echo $SHELL在我的终端上返回/bin/bash。当我使用sudo suand fire时echo $SHELL,它​​返回 /bin/sh。

答案1

我建议您尝试以下步骤:

  1. /etc/profile.d目录内,创建一个名为 file 的文件,set_java_path.sh其中包含以下行

    export JAVA_HOME=<_complete_path_to_java6_directory_>

  2. 运行bash命令一次以使上述更改加载。并运行start.sh脚本。

编辑:

如果该/etc/profile.d目录不存在,请创建一个名称相同的目录(权限:0755 & 所有者和组为 root)并在文件中/etc/profile添加以下代码:

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

答案2

要将环境变量保留为 sudoer,请添加Defaults env_keep += PATH到 sudoer 文件 ( sudo visudo)。

相关内容