यह समझना महत्वपूर्ण है कि ~विस्तार शेल (कुछ गोले का) की एक विशेषता है, यह एक जादुई चरित्र नहीं है जहां आपके घर की निर्देशिका का उपयोग किया जाता है।
इसका विस्तार किया जाता है (शेल द्वारा, जो कमांड लाइनों की व्याख्या करने के लिए उपयोग किया जाने वाला एक अनुप्रयोग है), जैसे $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विस्तार किया जा रहा है।
~यह$HOMEकिसी भी POSIX पर्यावरण के बराबर होगा ; लेकिन मुझसे गलती हो सकती है।