未设置 HOME 变量

meg*_*gas 12 upstart environment-variables

我有两台服务器,它们是相同的(我相信),生产服务器和登台服务器。

我在/etc/init/文件夹中有新贵脚本。

description "Discoure process"

setuid deploy
setgid deploy

respawn
respawn limit 3 30

start on runlevel [2345]
stop on runlevel [06]

script
exec /bin/bash <<'EOT'
  echo \"$HOME/.rbenv\"

  cd /home/deploy/discourse/current

  bundle exec bluepill load config/discourse.pill --no-privileged --base-dir tmp/bluepill --logfile log/bluepill.log
EOT
end script
Run Code Online (Sandbox Code Playgroud)

在临时服务器上它运行良好,但是当我在生产服务器上运行该脚本时,HOME 变量为空,代码echo "$HOME/.rbenv"评估为"/.rbenv"

这里可能有什么问题?谢谢

c0r*_*0rp 11

在 stackoverflow.com 上阅读这个问题,在 superuser.com上阅读这个用户的回答grawity

您不应该使用$HOMEin init.d,因为在此用户登录之前,不清楚要使用哪个用户家。

引用POSIX 规范

HOME
The system shall initialize this variable at the time of login to be a pathname
of the user's home directory. See <pwd.h>.
Run Code Online (Sandbox Code Playgroud)

您可以使用小技巧,myuser在脚本中获取用户的主文件夹

su - myuser -c /usr/bin/env | grep HOME
Run Code Online (Sandbox Code Playgroud)

最好使用下面的脚本,因为通常可以有其他HOME_*文件夹。比如JAVA_HOME等。

su - myuser -c /usr/bin/env | grep "^HOME="
Run Code Online (Sandbox Code Playgroud)


Jul*_*ing 8

似乎 $HOME 在进入 bash 之前被解释了?我会尝试以下方法之一。要么添加:

env HOME=/home/MyName
Run Code Online (Sandbox Code Playgroud)

到描述之后的代码。

或者将代码从脚本块内部移动到另一个脚本文件:

#! /bin/bash
Run Code Online (Sandbox Code Playgroud)

作为第 1 行。然后有

exec /path/to/my/script.sh
Run Code Online (Sandbox Code Playgroud)