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