$HOMEऔर ~आमतौर पर एक ही बात को देखें। यही है, वे "उपयोगकर्ता के घर" निर्देशिका के लिए पथ हैं जो सामान्य रूप "/ होम / उपयोगकर्ता नाम" का है।
जब, यदि कभी, ये समान निर्देशिका का संदर्भ नहीं देते हैं?
$HOMEऔर ~आमतौर पर एक ही बात को देखें। यही है, वे "उपयोगकर्ता के घर" निर्देशिका के लिए पथ हैं जो सामान्य रूप "/ होम / उपयोगकर्ता नाम" का है।
जब, यदि कभी, ये समान निर्देशिका का संदर्भ नहीं देते हैं?
जवाबों:
दोनों $HOMEऔर ~एक ही फ़ोल्डर, वर्तमान उपयोगकर्ता के होम फ़ोल्डर को इंगित करते हैं, लेकिन दोनों बहुत अलग चीजें हैं।
$HOMEएक पर्यावरण चर है , जो वर्तमान उपयोगकर्ता के होम फ़ोल्डर में सेट है।~एक शेल एक्सपेंशन सिंबल है , यानी वास्तविक कमांड के प्रदर्शन से पहले संसाधित होने वाले प्रतीकों में से एक। ~अकेले $ HOME के मूल्य में विस्तार करता है। ~nemoउपयोगकर्ता की होम निर्देशिका में फैलता है nemo। शेल विस्तार प्रतीक एक वर्ण (या वर्णों की जोड़ी) है जिसे वास्तविक कमांड बनाने के लिए शेल द्वारा संसाधित / व्याख्या किया जाता है। शेल विस्तार प्रतीक का एक और उदाहरण है *, जिसका उपयोग फ़ाइल नामों का विस्तार करने के लिए किया जाता है।~विंडोज पर $ घर, या% APPDATA% तक फैलता है। यदि वे परिभाषित नहीं हैं, तो यह "पासवर्ड डेटाबेस" में पथ की तलाश करेगा (जिसका आमतौर पर मतलब है /etc/passwd, लेकिन एलडीएपी या कुछ अन्य डेटा हो सकता है)। कुछ 20 साल पहले आपको चेतावनी दी जा सकती थी कि $ HOME कुछ मशीनों पर सेट नहीं किया जा सकता है, जबकि ~कुछ के विस्तार की गारंटी थी।
~फैलता है , नहीं । और cmd.exe पर, विस्तार नहीं करता है। $HOME$HOMEPATH$APPDATA~
HOMEएक वातावरण चर (एक OS अवधारणा है, में है श के साथ उदाहरण के सेट के लिए गोले exportया declare -x), नहीं एक खोल चर (परिभाषा जो की पूरी तरह से खोल पर निर्भर करता है, लेकिन में श गोले यह आम तौर पर साथ सेट किया गया है foo=valueया के साथ setया कुछ अन्य में तरीके)।
एक तरह से वे अलग-अलग हैं कि कैसे बैश शेल उन्हें "उद्धरण चिह्नों के प्रकार में संलग्न होने पर परिवर्तित करता है।
यदि आप echoइस तरह का उपयोग करते हैं, बिना किसी उद्धरण के, तब ~और $HOMEउसी तरह का प्रभाव पड़ता है:
$ echo ~
/home/elias
$ echo $HOME
/home/elias
हालांकि, "उनके चारों ओर उद्धरण चिह्नों के साथ , परिणाम भिन्न होता है:
$ echo "~"
~
$ echo "$HOME"
/home/elias
~केवल एक टिल्ड-उपसर्ग के एक भाग के रूप में फैलता है जो परिभाषा के अनुसार शब्द की शुरुआत में शुरू होना चाहिए। इसके अतिरिक्त, क्योंकि यह एक बार ग्लोबिंग पैटर्न का हिस्सा था, ~दोहरे उद्धरण चिह्नों के अंदर काम नहीं करेगा। तो, "~"या संरक्षित होने a~bका शाब्दिक मूल्य होगा ~।
एक एकल ~(या ~उसके बाद /) वर्तमान उपयोगकर्ता के घर तक विस्तारित होगा:
$ echo ~/.ssh
/home/user/.ssh
एक ~एक उपयोगकर्ता नाम के बाद यह है कि उपयोगकर्ता के घर फ़ोल्डर में विस्तार होगा:
$ echo ~root/.ssh
/root/.ssh
एक या एक के ~बाद +एक -और एक वैकल्पिक संख्या निर्देशिका स्टैक के तत्वों का विस्तार करेगी :
$ cd /etc
$ echo ~+0
/etc
$HOMEएक एकल के बराबर है ~, जो चर के लिए वाक्यविन्यास नियमों का पालन करता है। उदाहरण के लिए, यह दोहरे उद्धरण चिह्नों के अंदर फैलता है, परेशान हो सकता है, और स्ट्रिंग हेरफेर ऑपरेंड्स को इसके लिए लागू किया जा सकता है।
यह बहुत कुछ निर्भर करता है कि विस्तार क्या है। बैश में, ~फ़ाइल नाम के विस्तार या शब्द विभाजन को ट्रिगर किए बिना घर निर्देशिका प्राप्त करने के लिए एक सुविधाजनक तरीका है , भले ही इसके अयोग्य हो। उदाहरण के लिए:
$ 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और ~एक ही चीज़ का संदर्भ नहीं देते हैं - वे सामान्य रूप से डिफ़ॉल्ट रूप से करते हैं - और फिर आप जानबूझकर पर्यावरण चर को असाइन करते हैं ताकि उन्हें उसी चीज़ का उल्लेख न करें। यह एक अच्छा प्रदर्शन है लेकिन अनावश्यक रूप से भ्रमित करने वाला है।
$ HOME / मानक POSIX.2 बॉर्न / बिन / श में काम करने की अधिक संभावना है क्योंकि टिल्ड विस्तार BSD csh tcsh GNU बैश और अन्य में पाया जाने वाला एक एक्सटेंशन है।
यदि आप स्क्रिप्ट को बिजीबॉक्स या डैश या बीएसडी श के लिए पोर्टेबल लिखना चाहते हैं, तो अतिरिक्त अक्षरों में निवेश करें, जो कि आप के साथ क्रैश हो।
मुझे भी $ घर / अधिक पठनीय लगता है।
$HOMEऔर शायद ही कभी उपयोग होता है ~। मेरे पूर्व स्व शायद यह जानते थे।
~है निर्भर शैल जबकि $ HOME नहीं है।