ในกรณีของcsh
และtcsh
มันจะบันทึกค่าของ$HOME
ตัวแปรในเวลาที่เชลล์เริ่มต้น ( ใน$home
ตัวแปรตามที่ระบุไว้โดย @JdeBP )
หากคุณยกเลิกการตั้งค่าก่อนเริ่มต้นcsh
คุณจะเห็นสิ่งต่อไปนี้:
$ (unset HOME; csh -c cd)
cd: No home directory.
สำหรับbash
(และกระสุนที่คล้ายบอร์นส่วนใหญ่) ฉันเห็นพฤติกรรมที่แตกต่างจากของคุณ
bash-4.4$ unset HOME; cd
bash: cd: HOME not set
เนื้อหาของ$HOME
ตัวแปร initialised โดยกระบวนการเข้าสู่ระบบบนพื้นฐานของข้อมูลที่เก็บไว้ในฐานข้อมูลผู้ใช้กับผู้ใช้ของคุณชื่อ
ข้อมูลเกี่ยวกับชื่อผู้ใช้นั้นไม่สามารถใช้ได้ เชลล์ทั้งหมดสามารถรู้ได้อย่างชัดเจนว่าเป็นหมายเลขผู้ใช้ของกระบวนการที่กำลังดำเนินการและผู้ใช้หลายคน (ที่มีโฮมไดเร็กตอรี่ต่างกัน) สามารถแชร์หมายเลขผู้ใช้เดียวกันได้
ดังนั้นเมื่อ$HOME
หมดไปแล้วจะไม่มีวิธีที่เชื่อถือได้ในการนำกลับคืนมา
การเคียวรีฐานข้อมูลผู้ใช้ (ด้วยgetpwxxx()
API มาตรฐาน) สำหรับโฮมไดเร็กทอรีของผู้ใช้แรกที่มี uid เดียวกับที่รันเชลล์จะเป็นการประมาณเท่านั้น (ไม่ต้องพูดถึงความจริงที่ว่าฐานข้อมูลผู้ใช้สามารถเปลี่ยนแปลงได้ (หรือโฮม ไดเรกทอรีที่ถูกกำหนดเป็นค่าครั้งเดียว) นับตั้งแต่เซสชั่นการเข้าสู่ระบบเริ่มต้นขึ้น)
zsh
เป็นเปลือกเดียวที่ฉันรู้ว่าทำอย่างนั้น:
$ env -u HOME ltrace -e getpw\* zsh -c 'cd && pwd'
zsh->getpwuid(1000, 0x496feb, 114, 0x7f9599004697) = 0x7f95992fddc0
/home/chazelas
+++ exited (status 0) +++
กระสุนอื่น ๆ ทั้งหมดที่ฉันพยายามบ่นเกี่ยวกับการยกเลิกการตั้งค่าหน้าแรกนั้นหรือใช้/
เป็นค่าเริ่มต้นที่บ้าน
แต่พฤติกรรมที่แตกต่างคือfish
's ซึ่งดูเหมือนว่าจะสอบถามฐานข้อมูลสำหรับชื่อผู้ใช้ที่เก็บใน$USER
ถ้ามีหรือทำgetpwuid()
ถ้าไม่:
$ env -u HOME USER=bin ltrace -e getpw\* fish -c 'cd;pwd'
fish->getpwnam("bin") = 0x7fd2beba3d80
fish: Unable to create a configuration directory for fish. Your personal settings will not be saved. Please set the $XDG_CONFIG_HOME variable to a directory
where the current user has write access.
fish: Unable to create a configuration directory for fish. Your personal settings will not be saved. Please set the $XDG_CONFIG_HOME variable to a directory
where the current user has write access.
--- SIGCHLD (Child exited) ---
/bin
+++ exited (status 0) +++
$ env -u HOME -u USER ltrace -e getpw\* fish -c 'cd;pwd'
fish->getpwuid(1000, 0x7f529eb4fb28, 0x12d8790, 0x7f529e858697) = 0x7f529eb51dc0
fish->getpwnam("chazelas") = 0x7f529eb51d80
--- SIGCHLD (Child exited) ---
--- SIGCHLD (Child exited) ---
/home/chazelas
+++ exited (status 0) +++
SEGV เมื่อไม่มีผู้ใช้ ( https://github.com/fish-shell/fish-shell/issues/3599 ):
$ env -u HOME USER=foo fish -c ''
zsh: segmentation fault env -u HOME USER=foo fish -c ''