$ HOME और ~ के बीच अंतर


31

$HOMEऔर ~आमतौर पर एक ही बात को देखें। यही है, वे "उपयोगकर्ता के घर" निर्देशिका के लिए पथ हैं जो सामान्य रूप "/ होम / उपयोगकर्ता नाम" का है।

जब, यदि कभी, ये समान निर्देशिका का संदर्भ नहीं देते हैं?


11
~है निर्भर शैल जबकि $ HOME नहीं है।
कुल्फी

बहुत अधिक संबंधित unix.stackexchange.com/a/400715/85039
सर्गी

जवाबों:


45

दोनों $HOMEऔर ~एक ही फ़ोल्डर, वर्तमान उपयोगकर्ता के होम फ़ोल्डर को इंगित करते हैं, लेकिन दोनों बहुत अलग चीजें हैं।

  • $HOMEएक पर्यावरण चर है , जो वर्तमान उपयोगकर्ता के होम फ़ोल्डर में सेट है।
  • ~एक शेल एक्सपेंशन सिंबल है , यानी वास्तविक कमांड के प्रदर्शन से पहले संसाधित होने वाले प्रतीकों में से एक। ~अकेले $ HOME के ​​मूल्य में विस्तार करता है। ~nemoउपयोगकर्ता की होम निर्देशिका में फैलता है nemo। शेल विस्तार प्रतीक एक वर्ण (या वर्णों की जोड़ी) है जिसे वास्तविक कमांड बनाने के लिए शेल द्वारा संसाधित / व्याख्या किया जाता है। शेल विस्तार प्रतीक का एक और उदाहरण है *, जिसका उपयोग फ़ाइल नामों का विस्तार करने के लिए किया जाता है।

1
~विंडोज पर $ घर, या% APPDATA% तक फैलता है। यदि वे परिभाषित नहीं हैं, तो यह "पासवर्ड डेटाबेस" में पथ की तलाश करेगा (जिसका आमतौर पर मतलब है /etc/passwd, लेकिन एलडीएपी या कुछ अन्य डेटा हो सकता है)। कुछ 20 साल पहले आपको चेतावनी दी जा सकती थी कि $ HOME कुछ मशीनों पर सेट नहीं किया जा सकता है, जबकि ~कुछ के विस्तार की गारंटी थी।
Mirek Długosz

मेक जैसे कार्यक्रमों में यह अंतर उल्लेखनीय है, जब आपको यह जानने की आवश्यकता है कि आपको दोनों में से
किसकी

3
@ MirekDługosz विंडोज पर कम से कम गिट बैश पर, (के बराबर ) ~फैलता है , नहीं । और cmd.exe पर, विस्तार नहीं करता है। $HOME$HOMEPATH$APPDATA~
हाइड

1
@vanadium HOMEएक वातावरण चर (एक OS अवधारणा है, में है के साथ उदाहरण के सेट के लिए गोले exportया declare -x), नहीं एक खोल चर (परिभाषा जो की पूरी तरह से खोल पर निर्भर करता है, लेकिन में गोले यह आम तौर पर साथ सेट किया गया है foo=valueया के साथ setया कुछ अन्य में तरीके)।
हाइड

1
@ मैं गलत साबित हुआ। bash $ HOME की जाँच करेगा, अगर यह सेट नहीं है तो यह% APPDATA% के लिए जाँच करेगा, लेकिन केवल Windows पर; यदि यह सेट नहीं है, तो यह "पासवर्ड डेटाबेस" दिखेगा। देखें git.savannah.gnu.org/cgit/bash.git/tree/lib/readline/…
Mirek

17

एक तरह से वे अलग-अलग हैं कि कैसे बैश शेल उन्हें "उद्धरण चिह्नों के प्रकार में संलग्न होने पर परिवर्तित करता है।

यदि आप echoइस तरह का उपयोग करते हैं, बिना किसी उद्धरण के, तब ~और $HOMEउसी तरह का प्रभाव पड़ता है:

$ echo ~
/home/elias
$ echo $HOME
/home/elias

हालांकि, "उनके चारों ओर उद्धरण चिह्नों के साथ , परिणाम भिन्न होता है:

$ echo "~"
~
$ echo "$HOME"
/home/elias

13

~केवल एक टिल्ड-उपसर्ग के एक भाग के रूप में फैलता है जो परिभाषा के अनुसार शब्द की शुरुआत में शुरू होना चाहिए। इसके अतिरिक्त, क्योंकि यह एक बार ग्लोबिंग पैटर्न का हिस्सा था, ~दोहरे उद्धरण चिह्नों के अंदर काम नहीं करेगा। तो, "~"या संरक्षित होने a~bका शाब्दिक मूल्य होगा ~

एक एकल ~(या ~उसके बाद /) वर्तमान उपयोगकर्ता के घर तक विस्तारित होगा:

$ echo ~/.ssh
/home/user/.ssh

एक ~एक उपयोगकर्ता नाम के बाद यह है कि उपयोगकर्ता के घर फ़ोल्डर में विस्तार होगा:

$ echo ~root/.ssh
/root/.ssh

एक या एक के ~बाद +एक -और एक वैकल्पिक संख्या निर्देशिका स्टैक के तत्वों का विस्तार करेगी :

$ cd /etc
$ echo ~+0
/etc

$HOMEएक एकल के बराबर है ~, जो चर के लिए वाक्यविन्यास नियमों का पालन करता है। उदाहरण के लिए, यह दोहरे उद्धरण चिह्नों के अंदर फैलता है, परेशान हो सकता है, और स्ट्रिंग हेरफेर ऑपरेंड्स को इसके लिए लागू किया जा सकता है।


3

यह बहुत कुछ निर्भर करता है कि विस्तार क्या है। बैश में, ~फ़ाइल नाम के विस्तार या शब्द विभाजन को ट्रिगर किए बिना घर निर्देशिका प्राप्त करने के लिए एक सुविधाजनक तरीका है , भले ही इसके अयोग्य हो। उदाहरण के लिए:

$ HOME='/*'
$ echo $HOME
/bin /boot /dev /etc /home /lib /lib64 /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var
$ echo ~
/*

या:

$ HOME='/ a b'
$ printf "|%s|\n" $HOME ~
|/|
|a|
|b|
|/ a b|

इसलिए यदि आप किसी कारण के लिए कुश्ती कर रहे हैं (जिस स्थिति में आपको वास्तव में पूरी बात फिर से सोचनी चाहिए, तो यह सूअरों के लिए आसान है), ~अधिक सुविधाजनक हो सकता है।


उदाहरण के लिए, पायथन में कहीं ~और , और विभिन्न कार्यों$HOME द्वारा विस्तारित किया जाना है । कुछ अन्य स्थान चर की अनुमति देते हैं और अन्य शेल सिंटैक्स जैसे वाइल्डकार्ड या टिल्ड विस्तार (जैसे , जो चर विस्तार के लिए एक विशेष वाक्यविन्यास है) की अनुमति नहीं देते हैं । फिर भी अन्य जगहों पर अपवाद के रूप में टिल्ड के विस्तार की अनुमति है (उदाहरण के लिए, सिस्टमड ), लेकिन पासवार्ड डेटाबेस का उपयोग करने के बजाय सीधे क्वेरी करें । ~/.pam_environment$HOME


एक और बड़ा अंतर, जो आप यहां दिखाते हैं, लेकिन इसका उल्लेख नहीं करते हैं, यह है कि आप के मूल्य को बदल सकते हैं $HOME, लेकिन आप (सीधे) के मूल्य को नहीं बदल सकते ~
जो

इसलिए मैंने पूछा कि कब करते हैं $HOMEऔर ~एक ही चीज़ का संदर्भ नहीं देते हैं - वे सामान्य रूप से डिफ़ॉल्ट रूप से करते हैं - और फिर आप जानबूझकर पर्यावरण चर को असाइन करते हैं ताकि उन्हें उसी चीज़ का उल्लेख न करें। यह एक अच्छा प्रदर्शन है लेकिन अनावश्यक रूप से भ्रमित करने वाला है।
H2ONaCl

1

$ HOME / मानक POSIX.2 बॉर्न / बिन / श में काम करने की अधिक संभावना है क्योंकि टिल्ड विस्तार BSD csh tcsh GNU बैश और अन्य में पाया जाने वाला एक एक्सटेंशन है।

यदि आप स्क्रिप्ट को बिजीबॉक्स या डैश या बीएसडी श के लिए पोर्टेबल लिखना चाहते हैं, तो अतिरिक्त अक्षरों में निवेश करें, जो कि आप के साथ क्रैश हो।

मुझे भी $ घर / अधिक पठनीय लगता है।


एक स्क्रिप्ट में पठनीयता और दृश्यता महत्वपूर्ण हैं। शायद यही कारण है कि मेरी स्क्रिप्ट का उपयोग $HOMEऔर शायद ही कभी उपयोग होता है ~। मेरे पूर्व स्व शायद यह जानते थे।
21
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.