~ $ घर है, लेकिन कभी-कभी?


15

सीडी ~

के रूप में एक ही बात करता है

cd $HOME

जो भी है वही है

cd /home/tandu

तथापि,

cd ~not-tandu

में परिवर्तन /home/not-tandu

क्या यह विशुद्ध रूप से एक वाक्यात्मक विकल्प है? यह कर्नेल (या cdनिष्पादन योग्य?) द्वारा कैसे संभाला जाता है, क्या ~स्लैश को जोड़ने के लिए एक विशेष मामला है अगर बाकी सब छोड़ दिया गया है? यह कहना है, ~/और ~एक ही निर्देशिका में बदलना है, लेकिन ~aएक निर्देशिका है। वही नहीं जिसे आप बदलने के लिए किसी अन्य निर्देशिका के लिए कहा जा सकता है।


3
~ न-तंदू और ~ / न-तंदू की तुलना करने के लिए बेझिझक, एक बिंदु उपयोगकर्ता न-तंदू होम डायर के लिए और अन्य बिंदु आपके होमडियर में डायर न-तंदू के लिए।
जोहान

5
यह कर्नेल या "सीडी निष्पादन योग्य" नहीं है (क्योंकि ऐसी कोई बात नहीं है) - यह एक शेल निर्मित है।
पॉल टॉम्बलिन

चूंकि आप इसका उल्लेख नहीं करते हैं: cdबिना किसी पैरामीटर के जैसे काम करता है cd ~। यदि आप अपने cdसाथ प्रतिस्थापित करते हैं echoतो देख सकते हैं कि शेल द्वारा अभिव्यक्ति का विस्तार क्या है।
जोफेल

जवाबों:


19

~$HOMEकई गोले द्वारा प्रदान किए जाने के लिए एक उपनाम है , लेकिन $HOMEअधिक सार्वभौमिक है। $HOMEवास्तव में शेल को पर्यावरण चर घर में डालने (स्थानापन्न) करने के लिए कहता है। काफी अलग-अलग पर्यावरणीय चर हैं जिन्हें प्रतिस्थापित किया जा सकता है, envसूची के लिए प्रयास करें । ध्यान दें कि ~हमेशा पहचाना नहीं जाता है जब यह एक शब्द की शुरुआत में नहीं होता है। तुलना के लिए इन दो आदेशों का प्रयास करें:

ls /~
ls /$HOME

पहले एलएस निष्पादन योग्य के लिए पास हो जाता है, /~फिर ~रूट डायरेक्टरी नामक एक फाइल को देखने की कोशिश करता है , दूसरा फैलता है $HOMEऔर बन जाता है //home/userजो तब कमांड-लाइन तर्क के रूप में एलएस निष्पादन योग्य के लिए पारित हो जाता है। सभी POSIX सिस्टम (POSIX, UNIX और Linux सिस्टम कैसे काम करते हैं, इसके लिए मानक है) एकाधिक स्लैश को एक स्लैश के समान माना जाता है, इसलिए //home/userयह कहने के समान है /home/user~usernameपासवार्ड फ़ाइल में उपयोक्तानाम को देखने और उनके होम डायरेक्टरी को वापस करने के लिए शेल को बताने के लिए एक शॉर्टकट है। कोई समान पर्यावरण चर नहीं है। ये सभी प्रतिस्थापन शेल द्वारा किए जाते हैं और उनमें से अधिकांश द्वारा समर्थित होते हैं, लेकिन केवल पर्यावरण चर जैसे $HOMEअन्य शेल द्वारा समर्थित होने की गारंटी है। इसके अलावा,cdवास्तव में एक अंतर्निहित कमांड है। यह एक विशेष निर्देश है जो शेल को निर्देशिकाओं को बदलने के लिए कहता है। यह अन्य शेल बिल्ट-इन की तरह नहीं है जिसे एक अलग निष्पादन योग्य के रूप में लागू किया जा सकता echoहै क्योंकि यह शेल प्रक्रिया की एक मूलभूत विशेषता को बदलने के लिए उपयोग किया जाता है। echoकेवल प्रदर्शन के कारणों के लिए निर्मित एक शेल है, लेकिन UNIX के अच्छे पुराने दिनों में, यह केवल तब ही उपलब्ध था जब यह स्वयं निष्पादन योग्य हो /bin/echo


"फिर जो रूट डायरेक्टरी में ~ नामक फाइल को देखने की कोशिश करता है"; यह सभी यूनिक्स स्वादों के लिए है?
पचेरियर

17

~foo इसका मतलब है 'यूजर फू की होम डायरेक्टरी'।

यह कर्नेल द्वारा नहीं किया गया है, इसकी व्याख्या शेल द्वारा की गई है। जब भी शेल ~fooएक तर्क के रूप में देखता है, तो यह पारदर्शी रूप से इसे उपयोगकर्ता की होम डायरेक्टरी के साथ बदल देता है और इसे fooइसके स्थान पर पास करता है। इसलिए जब आप दौड़ते हैं cd ~tandu, तो वास्तव में शेल चल रहा होता है cd /home/tandu


1
यह विशेष रूप से क्या प्रतिस्थापन और किस एल्गोरिथ्म के साथ करता है? यह cdया खोल है? यदि आप एक शेल नहीं चला रहे हैं तो क्या होगा? क्या यह सरल है "अगर ~ किसी चीज का अनुसरण किया जाता है, तो अलग तरीके से विस्तार करें?" या इस अनूठी स्थिति के लिए कुछ अन्य विशेष हैंडलिंग है?
धमाका गोलियां

8
टिल्ड विस्तार पर बैश मैनुअल देखें । (कई अन्य गोले और कार्यक्रम समान नियमों का पालन करते हैं।)
cjm

4
@ टांडू: शेल करता है cd, ऐसा करने के लिए बाहरी निष्पादन योग्य नहीं है (यह संभव नहीं होगा)
मैट

1
@ टांडू: यदि आप एक शेल नहीं चला रहे हैं (जैसे कि इसका उपयोग करके कोशिश कर रहे हैं exec(2)), शेल विस्तार नहीं होता है। शेल विस्तार के बिना, ~किसी भी चीज़ से प्रतिस्थापित नहीं किया जाता है - यह सिर्फ एक और पूरी तरह से वैध चरित्र है। यह मुझे मेरे शुरुआती SunOS दिनों में /bin/shनहीं मिला क्योंकि यह नहीं हुआ था ~
एलेक्सियो

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