'सीडी' और 'सीडी ~' के बीच अंतर


10

मैं सोच रहा हूँ, अगर cd अकेले ही मुझे मेरे होम फोल्डर में भेजता है और cd ~ वही करता है, तो ~ पहले स्थान पर क्यों जोड़ा गया?

क्या यह BASH के लिए कुछ विशिष्ट है या वे दूसरे शेल में अलग तरह से व्यवहार करेंगे?


2
निश्चित रूप से डुप्लिकेट नहीं है। वह प्रश्न cd ~बनाम cd $HOMEबनाम के बारे में पूछ रहा है cd ~not-tandu। यह सवाल cdबनाम के बारे में पूछ रहा है cd ~

जवाबों:


17

कैन ~का उपयोग केवल इससे अधिक के लिए किया जा सकता है। कोई भी कमांड होम फोल्डर का शॉर्टकट होने से लाभ उठा सकती है। इसलिए यह आवश्यक नहीं है कि आप अपने घर में सीडी लगाना चाहते हैं, लेकिन इसके बारे में क्या ~/.config?

$ cd ~/.config

अन्यथा आपको घर का रास्ता लिखना होगा, $HOMEसंस्करण का उपयोग करना होगा, या दो cdएस करना होगा। फ़ाइलों की प्रतिलिपि बनाने या स्थानांतरित करने के लिए भी:

$ cp ~/downloads/some-file some/path/

चूंकि आपकी अधिकांश फाइलें घर में हैं, इसलिए शॉर्टकट रखना हमेशा अच्छा होता है।


हाय अहिंसा, वास्तव में मेरा सवाल 2 तरीकों की ओर अधिक उन्मुख है। मैं पहले से ही $ गृह चर का उपयोग ~ के बारे में जानता हूं, लेकिन यह दिमाग के साथ है, "सीडी" अकेले भी मुझे घर क्यों भेजता है। एक ही उद्देश्य के लिए 2 तरीके क्यों?
लुइस अल्वारादो

4
@CYREX मेरा अनुमान आपके घर निर्देशिका में जाने के लिए बहुत ही सामान्य मामले के लिए टाइपिंग को बचाने के लिए होगा।
बजे एक CVn

1
इसका अन्य उपयोग उपयोगकर्ता की डाउनलोड निर्देशिका में जाने के लिए ~करना cd ~user/downloadहै।
ott--

5

डूइंग 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

उस खाली लाइन को नोटिस करें जहां पहले echounset वैरिएबल आउटपुट करता है, और यह तथ्य कि। इसके विपरीत, हम सामान को इस तरह नहीं कर सकते हैं:

$ 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 ~

तब ~ को पहले स्थान पर क्यों जोड़ा गया था?

मैं कहना चाहता हूँ कि सुविधा और ऐतिहासिक कारण टिल्डे के बारे में जुड़े जवाब में बताया जाएगा। आखिरकार, यह केवल घर निर्देशिका विस्तार से अधिक प्रदर्शन करने के लिए बढ़ गया।


0

भले ही आप ऊपर या नीचे कई फ़ोल्डर स्तर हैं $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

0

~ का अर्थ है / घर / उपयोगकर्ता नाम स्थान, ताकि आप टाइप करते समय कुछ समय बचा सकें। उदाहरण के लिए cd / home / यूजरनेम / डाउनलोड cd ~ / डाउनलोड के समान है, लेकिन कम टाइपिंग। दोनों कमांड समान हैं, कार्य निर्देशिका को उस स्थान पर बदल दें।


ज़रुरी नहीं। उदाहरण rootके लिए घर की निर्देशिका आमतौर पर बाहर है/home
दिमित्री ग्रिगोरीव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.