HOME変数が設定されていません


12

私は2つのサーバーを持っていますが、それらは同一(私は信じています)であり、実動サーバーとステージングサーバーです。

/etc/init/フォルダーにupstartスクリプトがあります。

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

ステージングサーバーでは問題なく機能しますが、本番サーバーでそのスクリプトを実行すると、HOME変数が空​​になり、コードecho "$HOME/.rbenv"は次のように評価されます。"/.rbenv"

ここで何が問題になるのでしょうか?ありがとう


根本的な原因はわかりませんが、最初に静的に設定してみませんか?
jobin 2013

なぜ厄介なbashスクリプトなのか?(da)shが完全に正常に解釈するようです。
David Foerster

回答:


11

この読み stackoverflow.com上の問題と、この答えをユーザーがgrawitysuperuser.comに

あなたは使うべきではありません$HOMEinit.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>.

小さなハックを使用myuserして、スクリプトでユーザーのホームフォルダーを取得できます

su - myuser -c /usr/bin/env | grep HOME

通常は他のHOME_*フォルダが存在する可能性があるため、以下のスクリプトを使用することをお勧めします。などJAVA_HOMEなど

su - myuser -c /usr/bin/env | grep "^HOME="

8

$ HOMEがbashに入る前に解釈されているようですか?次のいずれかを試します。次のいずれかを追加します。

env HOME=/home/MyName

説明の直後のコードに。

または、次のコマンドを使用して、スクリプトブロック内から別のスクリプトファイルにコードを移動します。

#! /bin/bash

行1として。

exec /path/to/my/script.sh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.