करता है ~ हमेशा $ घर के बराबर


40

मुझे पता है कि यह शायद पहले पूछा गया है, लेकिन मैं इसे Google के साथ नहीं ढूंढ सका।

दिया हुआ

  • लिनक्स कर्नेल
  • कोई कॉन्फ़िगरेशन नहीं जो $ HOME बदलते हैं
  • दे घुमा के

विल ~ == $HOMEसच हो?


3
मैं ऐसा मानता हूं, लेकिन यह लिनक्स-विशिष्ट मुद्दा नहीं है। बल्कि, मेरा मानना ​​है कि ~यह $HOMEकिसी भी POSIX पर्यावरण के बराबर होगा ; लेकिन मुझसे गलती हो सकती है।
HalosGhost

4
नीचे दिए गए जवाबों के बावजूद ... हमेशा नहीं। तुलना echo "~"और echo "$HOME"
स्पार्कहॉक

@ श्रावक रुको, तो 1 + 1 2 नहीं है ? यह एक साजिश है! सरकार हमसे कुछ छुपा रही है! : पी
Doorknob

1
@ श्रावक, आप देखेंगे कि ओपी वास्तव में ~या तो बोली नहीं लगा या $HOME। : पी
हालोसगॉस्ट जूल

2
@ हालोसगॉस्ट आह, अच्छी बात है। (इसके अलावा, मैंने बाद में देखा कि माइकल होमर के जवाब में "एक एकल अयोग्य ~" का उल्लेख किया गया है ।) वैसे भी, अपने जैसे आकस्मिक पाठक के लिए कुछ रखने के लिए।
स्पार्कहॉक

जवाबों:


46

यह समझना महत्वपूर्ण है कि ~विस्तार शेल (कुछ गोले का) की एक विशेषता है, यह एक जादुई चरित्र नहीं है जहां आपके घर की निर्देशिका का उपयोग किया जाता है।

इसका विस्तार किया जाता है (शेल द्वारा, जो कमांड लाइनों की व्याख्या करने के लिए उपयोग किया जाने वाला एक अनुप्रयोग है), जैसे $varकि कमांड निष्पादित होने से पहले शेल कमांड लाइन में उपयोग किए जाने पर कुछ शर्तों के तहत इसके मूल्य में विस्तारित किया जाता है।

यह विशेषता पहली बार 1970 के दशक के अंत में सी-शेल में दिखाई दी (बॉर्न शेल में ऐसा नहीं था, न ही इसके पूर्ववर्ती थॉम्पसन शेल), बाद में कोर्न शेल (बॉर्न शेल पर बनाया गया एक नया शेल) में जोड़ा गया था। 80 के दशक)। यह अंततः POSIX द्वारा मानकीकृत किया गया था और अब अधिकांश गोले में उपलब्ध है जिसमें गैर-POSIX जैसे शामिल हैं fish

क्योंकि यह शेल में इस तरह के व्यापक उपयोग में है, इसलिए कुछ गैर-शेल एप्लिकेशन इसे होम निर्देशिका के रूप में भी पहचानते हैं। यही कारण है कि उनके विन्यास फाइल या उनके कई आवेदनों की बात है खुद कमांड लाइन ( mutt, slrn, vim...)।

bashविशेष रूप से (जो कि जीएनयू परियोजना का शेल है और व्यापक रूप से कई लिनक्स-आधारित ऑपरेटिंग सिस्टम में उपयोग किया जाता है), जब इसे लागू किया जाता है sh, तो ज्यादातर विस्तार के बारे में POSIX नियमों का पालन ​​करता है ~, और POSIX द्वारा निर्दिष्ट क्षेत्रों में, ज्यादातर कोर्न शेल की तरह व्यवहार करता है यह एक हिस्सा क्लोन है)।

जबकि $varअधिकांश स्थानों में विस्तार किया गया है (एकल उद्धरणों को छोड़कर), ~विस्तार, केवल एक विशिष्ट स्थिति में विस्तार किया जा रहा है।

इसका विस्तार तब होता है जब सूची संदर्भों में अपने तर्क पर, संदर्भों में जहां एक स्ट्रिंग की उम्मीद की जाती है।

यहां कुछ उदाहरण दिए गए हैं, जहां इसका विस्तार किया गया है bash:

  • cmd arg ~ other arg
  • var=~
  • var=x:~:x(POSIX द्वारा आवश्यक, जैसे चर के लिए उपयोग किया जाता है PATH, MANPATH...)
  • for i in ~
  • [[ ~ = text ]]
  • [[ text = ~ ]]( ~एटी एंड टी में पैटर्न के रूप में लिया जा रहा है kshलेकिन bash4.0 के बाद से विस्तार नहीं हो रहा है)।
  • case ~ in ~) ...
  • ${var#~} (हालांकि कुछ अन्य गोले में नहीं)
  • cmd foo=~(हालांकि, जब आह्वान नहीं किया जाता है sh, और केवल तब होता है जब बाईं तरफ क्या =होता है, एक अछूता bashचर नाम जैसा होता है )
  • cmd ~/x (जाहिर है POSIX द्वारा आवश्यक)
  • cmd ~:x(लेकिन नहीं x:~:xया x-~-x)
  • a[~]=foo; echo "${a[~]} $((a[~]))" (कुछ अन्य गोले में नहीं)

यहां कुछ उदाहरण दिए गए हैं जहां इसका विस्तार नहीं है:

  • echo "~" '~'
  • echo ~@ ~~(यह भी ध्यान दें कि ~uउपयोगकर्ता की होम निर्देशिका में विस्तार करने के लिए है u)।
  • echo @~
  • (( HOME == ~ )), $(( var + ~ ))
  • के साथ extglob: case $var in @(~|other))...(हालांकि case $var in ~|other)ठीक है)।
  • ./configure --prefix=~(जैसा --prefixकि एक मान्य चर नाम नहीं है)
  • cmd "foo"=~( bashउद्धरण के कारण)।
  • जब के रूप में लागू किया sh: export "foo"=~, env JAVA_HOME=~ cmd...

जैसा कि यह फैलता है: ~अकेले HOMEचर की सामग्री तक फैलता है , या जब यह सेट नहीं होता है, तो खाता डेटाबेस में वर्तमान उपयोगकर्ता की होम निर्देशिका के लिए (चूंकि POSIX के एक एक्सटेंशन के रूप में वह व्यवहार अपरिभाषित छोड़ देता है)।

यह ध्यान दिया जाना चाहिए कि ksh88 और bash4.0 से पहले के संस्करणों में, लिस्ट के संदर्भों में ग्लोबिंग (फ़ाइल नाम का निर्माण) के लिए टिल्ड का विस्तार हुआ:

$ bash -c 'echo "$HOME"'
/home/***stephane***
$ bash -c 'echo ~'
/home/***stephane*** /home/stephane
$ bash -c 'echo "~"'
~

कि सामान्य मामलों में समस्या नहीं होनी चाहिए।

ध्यान दें कि क्योंकि यह विस्तारित है, वही चेतावनी अन्य रूपों के विस्तार के रूप में लागू होती है।

cd ~

काम नहीं करता है अगर घटकों के $HOMEसाथ शुरू होता है -या शामिल होता ..है। इसलिए, भले ही यह कभी भी कोई फर्क नहीं करने की संभावना नहीं है, कड़ाई से बोल रहा है, एक को लिखना चाहिए:

cd -P -- ~

या और भी:

case ~ in
  (/*) cd -P ~;;
  (*) d=~; cd -P "./$d";;
esac

( $HOMEजैसे -, +2...) के मूल्यों के लिए कवर करने के लिए :

cd

(जैसा cdकि आप अपने घर निर्देशिका में बिना किसी तर्क के ले जाते हैं)

अन्य गोले में अधिक उन्नत ~विस्तार हैं। उदाहरण के लिए, zshहमारे पास:

  • ~4, ~-, ~-2(पूरा होने के साथ) अपने निर्देशिका ढेर में निर्देशिका (स्थानों पर आपने विस्तार करने के लिए प्रयोग किया जाता है cdसे पहले करने के लिए)।
  • डायनामिक डाइरेक्टरी नाम । आप अपने तंत्र को यह निर्धारित करने के लिए परिभाषित कर सकते हैं कि कैसे ~somethingविस्तार किया जा रहा है।

25

किसी भी सिस्टम पर बैश के किसी भी संस्करण में, हाँ~अपने आप में एक शब्द के रूप में विस्तार करने के लिए परिभाषित किया गया है:

$ घर का मूल्य

इसलिए यह हमेशा $HOMEचालू शेल के समान ही होगा । वहाँ इस तरह के रूप में कई अन्य टिल्ड विस्तार, कर रहे हैं ~userके लिए userघर निर्देशिका, लेकिन एक भी गैर उद्धृत ~अपने आप ही हमेशा के लिए विस्तार होगा "$HOME"

ध्यान दें कि व्यवहार की ~और $HOMEकुछ मामलों में अलग-अलग हो सकते हैं: विशेष रूप से, यदि $HOMEरिक्त स्थान (या अन्य शामिल आईएफएस वर्ण), तो $HOME(गैर उद्धृत), कई शब्दों को विस्तार होगा, जबकि ~हमेशा एक ही शब्द है। (उद्धृत) के ~बराबर होता है "$HOME"

आपके विशिष्ट प्रश्न के संबंध में:

[[ $HOME == ~ ]]

हमेशा सच है, क्योंकि शब्द-विभाजन को [[ दबा देता है[[ ~ == $HOME ]हो सकता है कि HOMEइसमें पैटर्न मिलान वर्ण हों, लेकिन [[ ~ == "$HOME" ]](यानी, उद्धृत "$HOME") हमेशा सत्य होता है। एकल ब्रैकेट के अंदर इसका उपयोग HOMEरिक्त स्थान या विशेष वर्णों के मानों के लिए एक वाक्यविन्यास त्रुटि हो सकती है । किसी भी समझदार होम निर्देशिका विन्यास के लिए ~और "$HOME"एक ही हैं और समान रूप की तुलना करें।


स्टीफन चेज़लस ने टिप्पणियों में एक मामले को नोट किया है जहां ~और $HOMEविभिन्न मूल्य देते हैं: यदि आप unset HOME, तो जब आप ~बैश का उपयोग getpwuidकरते हैं तो पासवर्ड डेटाबेस से बाहर एक मूल्य पढ़ने के लिए कॉल करेगा । यह मामला आपकी कॉन्फ़िगरेशन को बदलने की स्थिति से बाहर रखा गया है $HOME, लेकिन मैं इसे पूर्णता के लिए यहाँ उल्लेख करूँगा।


1
हालाँकि, /bin/shनहीं हो सकता है bash। मुझे यकीन नहीं है कि sh~
पोज़िक्स

1
POSIX निर्दिष्ट करता है ~~थॉमसन या बॉर्न शेल में नहीं था (जो उनके समय में उपलब्ध थे /bin/sh)। यह rcया इसके व्युत्पत्ति में नहीं है (जहाँ इसका उपयोग किसी और चीज़ के लिए किया जाता है)
स्टीफन चेज़लस

5
सहित कुछ गोले में bash, अगर HOMEपरेशान है, ~तो पासवार्ड डेटाबेस से उपयोगकर्ता की होम डायरेक्टरी तक फैलता है। तो यह एक ऐसा मामला है जहां ~के मूल्य में विस्तार नहीं हो सकता है $HOME
स्टीफन चेजलस

1
ध्यान दें कि bashबैश 4 से पहले टिल्ड विस्तार (कोशिश HOME='/*' bash -c 'echo /*') पर ग्लोबिंग किया जाता था । तो HOME=/*; [ "$HOME" = ~ ]वहाँ एक त्रुटि लौटेगी।
स्टीफन चेजलस

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.