ตัวแปร HOME ไม่ได้ถูกตั้งค่า


12

ฉันมีเซิร์ฟเวอร์สองเครื่องพวกเขาเหมือนกัน (ฉันเชื่อ) เซิร์ฟเวอร์ที่ใช้งานจริงและเซิร์ฟเวอร์เสมือน

และฉันมีสคริปต์พุ่งพรวดใน/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

บนเซิร์ฟเวอร์ staging ใช้งานได้ดี แต่เมื่อฉันเรียกใช้สคริปต์บนเซิร์ฟเวอร์ที่ใช้งานจริงตัวแปร HOME นั้นว่างเปล่ารหัสecho "$HOME/.rbenv"กำลังถูกประเมิน"/.rbenv"

อาจมีปัญหาอะไรที่นี่บ้าง ขอบคุณ


ฉันไม่ทราบสาเหตุที่แท้จริง แต่ทำไมไม่ตั้งค่าไว้ก่อน
jobin

ทำไมสคริปต์ทุบตีที่ยุ่งยาก? ดูเหมือนว่า (da) sh จะตีความได้อย่างสมบูรณ์แบบ
David Foerster

คำตอบ:


11

อ่านคำถามนี้ใน stackoverflow.com และคำตอบนี้โดยผู้ใช้grawityบน superuser.com

คุณไม่ควรใช้$HOMEใน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>.

คุณสามารถใช้แฮ็คเล็ก ๆ น้อย ๆ เพื่อสร้างโฟลเดอร์บ้านของผู้ใช้myuserในสคริปต์ของคุณ

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

จะดีกว่าหากใช้สคริปต์ด้านล่างเพราะโดยปกติจะมีHOME_*โฟลเดอร์อื่น เช่นJAVA_HOMEฯลฯ

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

8

ดูเหมือนว่า $ HOME กำลังถูกตีความก่อนที่มันจะถูกทุบตี? ฉันจะลองอย่างใดอย่างหนึ่งต่อไปนี้ เพิ่มอย่างใดอย่างหนึ่ง:

env HOME=/home/MyName

รหัสหลังจากคำอธิบาย

หรือย้ายรหัสจากภายในบล็อกสคริปต์ไปยังไฟล์สคริปต์อื่นด้วย:

#! /bin/bash

ในฐานะบรรทัดที่ 1 จากนั้นมี

exec /path/to/my/script.sh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.