मैं सोच रहा हूँ, अगर cd अकेले ही मुझे मेरे होम फोल्डर में भेजता है और cd ~ वही करता है, तो ~ पहले स्थान पर क्यों जोड़ा गया?
क्या यह BASH के लिए कुछ विशिष्ट है या वे दूसरे शेल में अलग तरह से व्यवहार करेंगे?
मैं सोच रहा हूँ, अगर cd अकेले ही मुझे मेरे होम फोल्डर में भेजता है और cd ~ वही करता है, तो ~ पहले स्थान पर क्यों जोड़ा गया?
क्या यह BASH के लिए कुछ विशिष्ट है या वे दूसरे शेल में अलग तरह से व्यवहार करेंगे?
जवाबों:
कैन ~
का उपयोग केवल इससे अधिक के लिए किया जा सकता है। कोई भी कमांड होम फोल्डर का शॉर्टकट होने से लाभ उठा सकती है। इसलिए यह आवश्यक नहीं है कि आप अपने घर में सीडी लगाना चाहते हैं, लेकिन इसके बारे में क्या ~/.config
?
$ cd ~/.config
अन्यथा आपको घर का रास्ता लिखना होगा, $HOME
संस्करण का उपयोग करना होगा, या दो cd
एस करना होगा। फ़ाइलों की प्रतिलिपि बनाने या स्थानांतरित करने के लिए भी:
$ cp ~/downloads/some-file some/path/
चूंकि आपकी अधिकांश फाइलें घर में हैं, इसलिए शॉर्टकट रखना हमेशा अच्छा होता है।
~
करना cd ~user/download
है।
डूइंग cd
मूल रूप cd
से बिना किसी तर्क और cd
व्यवहार के अनुसार कॉल कर रहा है "... यदि डीआईआर की आपूर्ति नहीं की जाती है, तो होम शेल चर का मान डिफ़ॉल्ट है।" ( बैश मैनुअल से )। इसके विपरीत, cd ~
जब आप cd
कमांड को तर्क की आपूर्ति करते हैं , जो कि होता है ~
और शेल टिल्ड विस्तार का प्रदर्शन करेगा । जहाँ तक उपयोगकर्ता के होम डाइरेक्टरी में वापस जाने का - वहाँ कोई अंतर नहीं है। या तो मामले में, HOME
पर्यावरण चर को समझा जाएगा:
$ env 'HOME=/usr' bash -c 'cd;pwd; cd ~;pwd'
/usr
/usr
प्रभावी रूप से, इससे भी कोई अंतर नहीं है cd $HOME
। हालांकि, जबकि cd
एक और केवल एक ही काम करेगा, टिल्ड का उपयोग अन्य विस्तार जैसे कि ~+
वर्तमान कामकाजी निर्देशिका के लिए किया जा सकता है ।
हालांकि, दिलचस्प रूप से पर्याप्त हम unset HOME
तोड़ सकते हैं cd
लेकिन ~
अभी भी काम करेंगे:
$ bash -c 'cd /usr;unset HOME;cd;pwd;cd ~;pwd'
bash: line 0: cd: HOME not set
/usr
/home/xieerqi
क्यों ? फिर से, मैनुअल में उत्तर दें:
यदि घर परेशान है, तो शेल को निष्पादित करने वाले उपयोगकर्ता की होम निर्देशिका को इसके बजाय प्रतिस्थापित किया जाता है। अन्यथा, टिल्ड-प्रीफ़िक्स को निर्दिष्ट लॉगिन नाम के साथ जुड़े होम डायरेक्टरी से बदल दिया जाता है।
ध्यान दें कि परेशान करना अलग है जो खाली चर बनाता है HOME=
और प्रभाव पड़ता है। प्रलेखन विशेष रूप से परेशान चर के बारे में बात करता है। खाली स्ट्रिंग के बराबर चर बनाने से वह प्रभाव पड़ेगा जो हम उम्मीद करेंगे:
bash-4.3$ env 'HOME=' bash -c 'cd /usr;set|grep "^HOME"; stat -c "%F" ~;cd;pwd'
HOME=
stat: cannot stat '': No such file or directory
/usr
यहां आप देख सकते हैं कि HOME
खाली स्ट्रिंग बनाने से टिल्ड और cd
व्यवहार दोनों टूट जाते हैं।
टिल्डे और $HOME
अस्तित्व के लिए कुछ अंतर और अलग कारण है। $HOME
एक शेल चर है, जो सह-संयोग से पर्यावरण चर में से एक भी होता है - और यह सभी कार्यक्रमों के लिए उपलब्ध है; C में आप इसका उपयोग environ()
करने के लिए उपयोग करेंगे। इसके विपरीत, tilde
शेल-विशिष्ट सिंटैक्स है जो टिल्ड विस्तार करता है, हालांकि आप सी में wordexp()
शेल-जैसे विस्तार ( संदर्भ ) करने के लिए फ़ंक्शन का उपयोग कर सकते हैं ।
कारण है कि ~
दर्शाता HOME
में जवाब दिया गया है इस सवाल : एक बार एक समय पर टिल्ड चरित्र के साथ एक ही कुंजी साझा HOME
लेअर-Siegler ADM -3 ए टर्मिनल पर। HOME
इसके विपरीत पर्यावरण चर है जिसका विशुद्ध रूप से प्रतीकात्मक अर्थ है और कोई भौतिक प्रतिनिधित्व नहीं है।
इसके अलावा, यह तथ्य कि HOME
पर्यावरण चर है, हमें इसे परेशान करने की अनुमति देता है, जहां हम ~
साधारण साधनों के माध्यम से कुछ और करने के लिए सेट नहीं कर सकते हैं ।
# cd ~ will still work, because ~ is blank, so it's same as just cd
$ bash -c 'unset HOME; echo $HOME; cd ~;pwd'
/home/xieerqi
$ env 'HOME=' bash -c 'echo $HOME; cd ~;pwd'
/home/xieerqi
उस खाली लाइन को नोटिस करें जहां पहले echo
unset वैरिएबल आउटपुट करता है, और यह तथ्य कि। इसके विपरीत, हम सामान को इस तरह नहीं कर सकते हैं:
$ bash -c '~=; cd ~;pwd'
bash: ~=: command not found
/home/xieerqi
$ bash -c '~=$'\0'; cd ~;pwd'
bash: ~=bash: command not found
/home/xieerqi
$ bash -c 'unset ~; cd ~;pwd'
bash: line 0: unset: `/home/xieerqi': not a valid identifier
/home/xieerqi
हालाँकि, फेरबदल HOME
प्रभावित करता है ~
:
$ env 'HOME=' bash -c 'echo $HOME; stat ~;'
stat: cannot stat '': No such file or directory
इसके अलावा, क्योंकि ~
यह भी विस्तार चरित्र के रूप में काम करता है, हम वर्तमान कार्य निर्देशिका को दिखाने के लिए इस तरह से सामान कर सकते हैं:
$ bash -c 'cd /etc/;stat -c "%n" ~+'
/etc
जबकि अगर हम पर्यावरण चर के माध्यम से ऐसा करना चाहते हैं, तो हमें इसकी आवश्यकता है PWD
, और HOME
यदि आप ऐसा करते हैं, या जैसे आप करते हैं echo $HOME+
- तो यह केवल स्ट्रिंग / चर समवर्ती है। लेकिन फिर से, ~+
पर्यावरण चर से जानकारी लेता है:
$ bash -c 'cd /etc/;PWD="/usr";stat -c "%n" ~+'
/usr
नोट : ~+
और ~-
विस्तार में काम करते हैं ksh
, लेकिन अंदर नहीं dash
।
आपके कुछ विशिष्ट प्रश्नों के उत्तर देने के लिए:
क्या यह BASH के लिए कुछ विशिष्ट है या वे दूसरे शेल में अलग तरह से व्यवहार करेंगे?
नहीं, यह लगातार व्यवहार होना चाहिए। ksh
, dash
, और csh
- के साथ एक ही सब व्यवहार cd
या cd ~
।
तब ~ को पहले स्थान पर क्यों जोड़ा गया था?
मैं कहना चाहता हूँ कि सुविधा और ऐतिहासिक कारण टिल्डे के बारे में जुड़े जवाब में बताया जाएगा। आखिरकार, यह केवल घर निर्देशिका विस्तार से अधिक प्रदर्शन करने के लिए बढ़ गया।
भले ही आप ऊपर या नीचे कई फ़ोल्डर स्तर हैं $HOME
, कमांड cd
और cd ~
एक ही काम करते हैं और अलग-अलग नहीं हैं - यह आपको अपने होम निर्देशिका में वापस भेज देगा।
कैसे: जब आप घर के ऊपर 1 या अधिक फ़ोल्डर का स्तर रखते हैं और आप नीचे एक उप-निर्देशिका 1 या उससे अधिक फ़ोल्डर स्तर पर सीधे जाना चाहते हैं $HOME
, तो टिल्डे ( ~
) पाठ को संदर्भित करने के लिए उपयोग किए जाने वाले पाठ को प्रतिस्थापित करने के लिए उपयोग किए जाने पर आपको कीस्ट्रोक्स से बचाते हैं। करने के लिए $HOME
जब एक टाइपिंग cd
आदेश। उदाहरण के लिए;
/$ cd # (or cd ~)
~$ pwd
/home/foo
~$ dir
bar bar2 bar3
~$ cd ..
/$ cd ..
/$ pwd
/
/$ cd /bar3
bash: cd: /bar3: no such file or directory
/$ cd ~/bar3 # (instead of "cd /home/foo/bar3")
~/bar3$ pwd
/home/foo/bar3
~ का अर्थ है / घर / उपयोगकर्ता नाम स्थान, ताकि आप टाइप करते समय कुछ समय बचा सकें। उदाहरण के लिए cd / home / यूजरनेम / डाउनलोड cd ~ / डाउनलोड के समान है, लेकिन कम टाइपिंग। दोनों कमांड समान हैं, कार्य निर्देशिका को उस स्थान पर बदल दें।
root
के लिए घर की निर्देशिका आमतौर पर बाहर है/home
cd ~
बनामcd $HOME
बनाम के बारे में पूछ रहा हैcd ~not-tandu
। यह सवालcd
बनाम के बारे में पूछ रहा हैcd ~
।