के मामले में cshऔर tcsh, यह $HOMEउस समय चर के मूल्य को रिकॉर्ड करता है जिस समय शेल शुरू किया गया था ( इसके $homeचर में @JdeBit द्वारा उल्लेख किया गया था )।
यदि आप इसे शुरू करने से पहले परेशान करते हैं csh, तो आपको कुछ ऐसा दिखाई देगा:
$ (unset HOME; csh -c cd)
cd: No home directory.
के लिए bash(और अधिकांश अन्य बॉर्न की तरह गोले), मैं तुम्हारा तुलना में एक अलग व्यवहार देखते हैं।
bash-4.4$ unset HOME; cd
bash: cd: HOME not set
$HOMEचर की सामग्री को आपके उपयोगकर्ता नाम के खिलाफ उपयोगकर्ता डेटाबेस में संग्रहीत जानकारी के आधार पर लॉगिन प्रक्रिया द्वारा प्रारंभ किया जाता है ।
उपयोगकर्ता नाम के बारे में जानकारी हमेशा उपलब्ध नहीं होती है। सभी शेल यह जान सकते हैं कि यह प्रक्रिया का उपयोगकर्ता नाम है जो इसे निष्पादित कर रहा है और कई उपयोगकर्ता (विभिन्न होम निर्देशिकाओं के साथ) एक ही उपयोगकर्ता साझा कर सकते हैं।
इसलिए, एक बार $HOMEचले जाने के बाद इसे वापस लाने का कोई विश्वसनीय तरीका नहीं है।
पहले डेटाबेस की getpwxxx()मानक निर्देशिका के साथ उपयोगकर्ता डेटाबेस ( मानक एपीआई के साथ ) को छोड़ना, जो यूआईडी के समान है, जो शेल को चलाने वाला केवल एक सन्निकटन होगा (इस तथ्य का उल्लेख नहीं करने के लिए कि उपयोगकर्ता डेटाबेस बदल सकता था (या घर) लॉगिन सत्र शुरू होने के बाद से निर्देशिका को एक बार के मूल्य के रूप में परिभाषित किया जा रहा है)।
zsh एकमात्र शेल जो मुझे पता है कि ऐसा करता है:
$ env -u HOME ltrace -e getpw\* zsh -c 'cd && pwd'
zsh->getpwuid(1000, 0x496feb, 114, 0x7f9599004697) = 0x7f95992fddc0
/home/chazelas
+++ exited (status 0) +++
अन्य सभी गोले मैंने या तो उस परेशान घर के बारे में शिकायत की या /डिफ़ॉल्ट घर मूल्य के रूप में उपयोग करने की कोशिश की ।
फिर भी एक अलग व्यवहार है fish, जो $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 ''