एक शेल घर (नों) को कैसे जानता है?


25

प्रत्येक शेल में एक पर्यावरण चर $ HOME सेट (उदा:) है /Users/lotolo। अगर मैं csh के अधीन हूं unsetenv HOMEतो मैं कर सकता हूं और अगर मैं करूंगा तो cdमैं अपने घर में रहूंगा। मैंने इसे बैश ( unset HOME) पर भी परीक्षण किया है और यह समान व्यवहार है। तो शेल को कैसे पता चलता है कि मेरा / अन्य_सियर घर कहां है? यह उन मूल्यों को कहां पढ़ता है?

यह कोई डुप्लिकेट नहीं है क्योंकि मेरा सवाल यह नहीं है कि मुझे कैसे पता है, लेकिन शेल कैसे जानता है HOME। और यह व्यवहार अन्य उपयोगकर्ताओं के लिए भी बढ़ाया जाता है।


1
@StephenKitt, डुप्लीकेट नहीं। यहां हम वर्तमान उपयोगकर्ता की होम निर्देशिका के लिए शेल व्यवहार की बात कर रहे हैं।
स्टीफन चेज़लस

से साधारण मामले में /etc/passwd। कुछ सिस्टम LDAP, NIS सर्वर आदि में उस जानकारी को स्टोर कर सकते हैं
Sat

1
कार्यक्रम (गोले सहित) बस फोन getpwuid(3)या समान। एलडीएपी, एनआईएस, एनआईएस + आदि getpwuid(3)से जानकारी प्राप्त करने के लिए कुछ सिस्टम को "री-रूट" में कॉन्फ़िगर किया जा सकता है/etc/passwd
अक्टूबर को सतो कत्सुरा

@StephenKitt, मेरा उत्तर देखें
स्टीफन चेज़लस

1
@ GAD3R, ऊपर चर्चा देखें, स्टीफनकिट ने पहले ही उसी डुप्लिकेट की ओर इशारा किया था (जो कि वह पीछे हट गया), लेकिन मैं ऊपर तर्क देता हूं (और मेरा जवाब भी देखता हूं) कि यह डुप्लिकेट नहीं है।
स्टीफन चेजेलस

जवाबों:


33

के मामले में 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 ''

2
मुझे लगता है कि हम इस मुद्दे को रिपोर्ट कर सकते हैं! बहुत अच्छा जवाब btw, धन्यवाद!
लोट्टो

1
@ लिटोल्लो, हां, मैं fishयह देखने के लिए तैयार हूं कि क्या बग वहां भी है। संपादित करें। हाँ यही है।
स्टीफन चेज़लस

अब मैं उत्सुक हूँ: कौन सा पर्यावरण चर खोल देता है अधिकतम उपयोगकर्ता-अनफ्रेंडली यदि परेशान है? PATH? TERM? USER?
user1024

यहाँ एक विषम रेखा है: "केवल एक सन्निकटन होगा ..." कोष्ठक उस अनुच्छेद में भी पंक्तिबद्ध नहीं है। यह क्या होना चाहिए था?
मूरू

1
@ मुरु Querying the user database... would only be...वास्तव में इतना स्पष्ट नहीं है
edc65

6

तो शेल को कैसे पता चलता है कि मेरा / अन्य_सियर घर कहां है?

यह नहीं है आप प्रयोग ठीक से नहीं कर रहे हैं। जैसा कि आप सी शेल मैनुअल से देख सकते हैं, यदि कोई तर्क नहीं दिया जाता है तो cdकमांड homeवेरिएबल के मान में बदल जाती है। यदि यह चर अप्रभावित है, तो यह नहीं पता है कि निर्देशिका को कहाँ बदलना है और एक त्रुटि प्रिंट करता है:

मशीन: ~> सेट घर = /
मशीन: / घर / उपयोगकर्ता> सीडी
मशीन: ~> परेशान घर
मशीन: /> सी.डी.
सीडी: कोई घर निर्देशिका नहीं
मशीन: /> 

आप गलत वैरिएबल को अनसेट करते हैं। यह HOMEपर्यावरण चर नहीं है, यह homeसी शेल का आंतरिक चर है (शेल के शुरू होने पर पूर्व के मूल्य से आरंभ किया जाता है, लेकिन अन्यथा अपने आप में एक स्वतंत्र चर है)।


csh पर नहीं (कम से कम मेरे संस्करण पर: "tcsh 6.18.01 (Astron) 2012-02-14 (x86_64-apple-darwin)") यह घर का मूल्य ले जाने वाला गृह चर है। लेकिन जैसा कि @ स्टेफेन चेज़लस ने कहा कि मुझे शेल को लॉन्च करने से पहले वेरिएबल को अनसेट करना होगा क्योंकि यह स्टार्ट पर होम वैल्यू सेट करेगा।
लोट्टो

इसके बाद के संस्करण है सी खोल, जो मैं एक आसान OpenBSD मशीन पर भाग गया, और अपने व्यवहार को दर्शाता है। यह टेनेक्स सी शेल भी नहीं है (यद्यपि यह समान व्यवहार करता है)।
JDBP

हां, मैंने इसे देखा ... मैंने टाइप किया cshलेकिन जाहिर तौर पर यह tcsh
अलियास

0

उपयोगकर्ता के होम डायरेक्टरी का पाथनाम होने के लिए सिस्टम ने गृह चर को लॉगिन के समय सेट किया। यह द्वारा निर्धारित है

  • ग्राफिकल सेशन के लिए gdm, kdm या xdm।
  • कंसोल, टेलनेट और रागिनी सत्रों पर लॉगिन करें
  • SSH कनेक्शन के लिए sshd

आप इसका मान बदल सकते हैं, लेकिन ध्यान दें क्योंकि .bashrc, .profile, .xinitrc, आदि को घर की निर्देशिका में नहीं पढ़ा जाएगा।


लेकिन मैं इसे ($ HOME) अनसेट कर सकता हूं ... सही है? और यह कैसे पता चलता है कि किसी अन्य उपयोगकर्ता का घर कहां है?
लोटोलो

1
usermod -d HOME_DIRजब कोई नया usre बनाया जाता है, तो आप इसे कमांड का उपयोग करके अपडेट कर सकते हैं । डिफ़ॉल्ट घर / घर / $ उपयोगकर्ता नाम है और इसे लॉगिन कार्यक्रम द्वारा निर्धारित किया जाता है।
डब्बाबी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.