Die Variable HOME ist nicht festgelegt

11

Ich habe zwei Server, sie sind identisch (glaube ich), Produktions- und Staging-Server.

Und ich habe ein Startskript im /etc/init/Ordner.

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

Auf dem Staging-Server funktioniert es gut, aber wenn ich dieses Skript auf dem Produktionsserver ausführe, echo "$HOME/.rbenv"ist die HOME-Variable leer, und der Code wird ausgewertet"/.rbenv"

Was könnte hier ein Problem sein? Vielen Dank

Megas
quelle
Ich kenne die Grundursache nicht, aber warum nicht zuerst statisch einstellen?
Jobin
Warum das umständliche Bash-Skript? Es sieht so aus, als würde (da) sh es perfekt interpretieren.
David Foerster

Antworten:

10

Lesen Sie diese Frage auf stackoverflow.com und diese Antwort des Benutzers grawityauf superuser.com

Sie sollten verwenden nicht $HOMEin init.d, weil es nicht klar , welche Benutzer zu Hause verwendet wird, bis dieser Benutzer anmeldet.

Zitat aus der POSIX-Spezifikation :

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>.

Sie können einen kleinen Hack verwenden, um den Home-Ordner des Benutzers myuserin Ihrem Skript abzurufen

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

Es ist besser, das folgende Skript zu verwenden, da es normalerweise andere HOME_*Ordner geben kann . Wie JAVA_HOMEetc.

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

Scheint, als würde das $ HOME interpretiert, bevor es zur Bash geht? Ich würde eines der folgenden versuchen. Entweder hinzufügen:

env HOME=/home/MyName

zum Code direkt nach der Beschreibung.

Oder verschieben Sie den Code aus dem Skriptblock in eine andere Skriptdatei mit:

#! /bin/bash

als Zeile 1. Dann haben

exec /path/to/my/script.sh
Julian Stirling
quelle