क्या `~ / दस्तावेज` एक रिश्तेदार या एक निरपेक्ष पथ है?


37

यह केवल एक शब्दावली का सवाल है, लेकिन जो मेरे सिर में घूमता रहता है।

यह एक एलपीआईसी तैयारी पुस्तक से एक अभ्यास परीक्षा से आता है । पुस्तक के अनुसार सही उत्तर वह ~/Documentsसापेक्ष निर्देशिका है क्योंकि यह गृह निर्देशिका के सापेक्ष है।

हालाँकि, इस पुस्तक में टाइपोस और गलतियों का एक सम्मानजनक अनुपात है, इसलिए मैं वहां लिखी गई सभी चीज़ों को स्वीकार नहीं कर सकता। यहां मैं सहमत नहीं हूं क्योंकि मेरे ~लिए शेल द्वारा विस्तारित $HOMEचर या वर्तमान उपयोगकर्ता होम निर्देशिका पथ (cf. man bash) में एक चर के रूप में कार्य करता है , इसलिए वास्तविक पथ वह है /home/myuser/Documentsजो वास्तव में एक निरपेक्ष निर्देशिका है।

यहां तक ​​कि विकिपीडिया , एक बार के लिए, इस विषय पर मेरी कोई मदद नहीं करता है (भले ही यह पुष्टि करता हो कि पुस्तक इस पर गलत है):

एक पूर्ण या पूर्ण पथ वर्तमान कार्य निर्देशिका की परवाह किए बिना किसी फ़ाइल सिस्टम में एक ही स्थान पर इंगित करता है। ऐसा करने के लिए, इसमें रूट डायरेक्टरी होनी चाहिए।

इसके विपरीत, एक रिश्तेदार पथ कुछ दिए गए कार्य निर्देशिका से शुरू होता है, पूर्ण निरपेक्ष पथ प्रदान करने की आवश्यकता से बचता है।

यहां फिर से, मैं सहमत नहीं हूं: इस परिभाषा के अनुसार, वह पथ /opt/kde3/bin/../libजो वर्तमान कार्यशील निर्देशिका पर निर्भर नहीं करता है, एक निरपेक्ष होना चाहिए, हालांकि इस पुस्तक के लेखक की वर्तमान समझ इस पथ को एक सापेक्ष बनाती है।

वेबस्टर डिक्शनरी के अनुसार एक त्वरित वेब-खोज सिर्फ मेरी हताशा में इजाफा कर रही है :

निरपेक्ष पथ - रूट निर्देशिका के सापेक्ष एक पथ। इसका पहला वर्ण पथनाम विभाजक होना चाहिए।

तो $HOME/Documents, या अभी भी $HOMEपूर्ण निर्देशिका नहीं माना जाएगा? या क्या यह परिभाषा चर विस्तार का अर्थ है? शेल के ~चरित्र के बारे में क्या ? क्या रिश्तेदार बनाम निरपेक्ष निर्देशिका की कोई विश्वसनीय परिभाषा है जो मुझे कहीं मिल सकती है और क्या मैं गलत हूं?


7
सभी पथ सापेक्ष हैं, उनमें से कुछ केवल मूल निर्देशिका के सापेक्ष हैं /, और जिन्हें हम पूर्ण कहते हैं। इस प्रकार सब कुछ क्या शुरू होता है से /मैं पूर्ण कहेंगे (भले ही यह है /usr/../etc) और सब कुछ किसी और मैं कहेंगे रिश्तेदार ( ~/Doc, Doc, ../john/Doc, $HOME/..., ...)। मुद्दा यह है कि निरपेक्ष को वर्तमान कार्यशील निर्देशिका या वर्तमान उपयोगकर्ता की परवाह किए बिना काम करना चाहिए। रिश्तेदार केवल कुछ विशिष्ट संकीर्ण मामलों में ही काम कर सकते हैं।
jijij

6
उपयोगकर्ता कौन है इसके आधार पर पथ भिन्न स्थान पर विस्तारित हो सकता है। यह कहते हुए कि, यह मेरी राय में अभी भी एक निरपेक्ष मार्ग है, रिश्तेदार मार्ग नहीं है। हालांकि मुझे नहीं लगता कि निरपेक्ष और सापेक्ष पथ की परिभाषाएँ इतनी सटीक रूप से परिभाषित हैं। यह गणित नहीं है। यह प्रश्न वास्तव में समझ, इमो का परीक्षण नहीं करता है और व्यर्थ है।
फहीम मीठा

1
@FaheemMitha: LPIC एक वितरण तटस्थ लिनक्स प्रमाणीकरण है। प्रमाणीकरण स्वयं ठीक लगता है, लेकिन इस परीक्षा के बारे में (कम से कम कुछ) किताबों को स्व-अध्ययन के रूप में तैयार करने के लिए बेची जाने की बात से बहुत दूर है ...
WhiteWinterWolf

2
@ जिमीज: "रिश्तेदार" में पथ के संदर्भ में एक विशिष्ट तकनीकी अर्थ है, और शब्द का एक अलग अंग्रेजी-भाषा का उपयोग करना बुरा व्यवहार है। मैं ~/fooएक रिश्तेदार पथ को कॉल करने से पूरी तरह असहमत हूं । आपको जो मिल रहा है वह हार्ड-कोडिंग और पैरामीटराइजेशन के बीच का अंतर है। अधिक जानकारी के लिए मेरा जवाब देखें।
पीटर कॉर्ड्स

1
वेबस्टर डिक्शनरी की परिभाषा सही है, लेकिन बहुत ही भ्रामक है। हालाँकि, इसका तात्पर्य है कि इस तरह के तार ~/Documentsऔर $HOME/Documentsपथ नहीं हैं। वे विस्तार के बाद पहचान (निरपेक्ष) पथ करते हैं, लेकिन वे स्वयं पथ नहीं हैं। मुझे लगता है कि यूनिक्स / लिनक्स उपयोगकर्ता इस शब्द का उपयोग करने से सहमत हैं, लेकिन इसमें कोई संदेह नहीं है कि उन तारों को स्वयं पथ भी कहा जाता है।
रिस्टोरियरपोस्ट

जवाबों:


41

यदि लेखक एक पथ के रूप में उस शाब्दिक स्ट्रिंग (शेल विस्तार के बिना) के बारे में बात करके आपको पकड़ने की कोशिश कर रहा था, तो यह एक सापेक्ष पथ है! mkdir -p './~/Documents')। अन्यथा:


यह एक पूर्ण मार्ग है , क्योंकि इसे हल करना प्रक्रिया की वर्तमान कार्यशील निर्देशिका पर निर्भर नहीं करता है। सापेक्ष पथ हमेशा प्रक्रिया की कार्यशील निर्देशिका के सापेक्ष होता है। या सिमलिंक लक्ष्यों के मामले में, सिमलिंक के स्थान के सापेक्ष। ( gcc -> gcc-5.2बनाम gcc -> /usr/bin/gcc-5.2)। यह NFS-mounts और अन्य मामलों के लिए मायने रखता है, जहाँ आप अलग-अलग निरपेक्ष रास्तों के माध्यम से एक ही सिमलिंक को प्राप्त कर सकते हैं। जैसे

/net/tesla/home/peter/foo -> bar  # always works from other machines

/net/tesla/home/peter/foo -> /home/peter/bar  # references my home dir on the local machine, not tesla.

डेबियन कभी-कभी ../../doc/whatever/whateverएक पूर्ण सिम्लिंक लक्ष्य के बजाय, सिम्बलिंक को स्थापित करेगा , इसलिए यह तब काम करता है जब एनएफएस कहीं और घुड़सवार होता है, या जब chroot(8)इसमें बिना चेरोट को देखता है।

हर यूनिक्स प्रक्रिया की अपनी सीडब्ल्यूडी है। pwdआदेश बस इसे मुद्रित करने के लिए मौजूद है।

देखें: POSIX सिस्टम कॉल के साथ निर्देशिकाओं को बदलने के बारे में अधिक जानकारी के लिए http://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html


जैसा कि बाकी सभी ने कहा है, किसी ~भी चीज़ के लिए पथ का उपयोग करने से पहले शेल द्वारा विस्तार किया जाता है। ~/bin/myprogशेल स्क्रिप्ट का उपयोग करने से यह विभिन्न उपयोगकर्ताओं के लिए अलग तरह से काम करेगा। के बीच का अंतर ~/bin/fooऔर /home/peter/bin/fooउनमें से एक स्थान हार्ड कोड किए गए, जबकि अन्य यह parameterized है किया है। ~संस्करण को सापेक्ष पथ कहने के लिए यह एक त्रुटि (IMO) है ।

चीजों के बारे में बात करना "एक पर्यावरण चर के सापेक्ष" सिर्फ भ्रमित करने वाला है। यह उन शर्तों के अलग-अलग अंग्रेजी-भाषा अर्थों का उपयोग करने के लिए बुरा है, जिनके संदर्भ में आप उनका उपयोग कर रहे हैं।

एक टूटी हुई प्रणाली पर, साथ HOME=a/relative/path, ~/fooएक रिश्तेदार पथ का विस्तार होगा। यह एक प्रयोग करने योग्य सेटअप बिल्कुल नहीं होगा।


3
इस उत्तर के लिए धन्यवाद, यह मुझे सबसे व्यापक लगता है। मुझे यह भी आभास होता है कि लेखक ने गलत तरीके से विहित मार्ग की धारणा को इसमें मिलाया था (जिसका लेखक कहीं भी उल्लेख नहीं करता है)। /opt/kde3/bin/../libउदाहरण के लिए गलत तरीके से एक रिश्तेदार पथ के रूप में वर्गीकृत किया जाता है: यह है एक निरपेक्ष पथ लेकिन है नहीं विहित एक। जैसा कि आपने कहा, यह सब कुछ भ्रमित करता है, इसलिए आपके स्पष्टीकरण और NFS से संबंधित जानकारी के लिए धन्यवाद :)!
व्हाइटवॉर्नफ़ॉल्फ

1
मुझे यह निष्कर्ष निकालना है कि टेस्ट-प्रीप बुक लिखना बहुत मजेदार नहीं है, और यह कि वे लोग जो अपनी रोजमर्रा की कंप्यूटिंग के लिए यूनिक्स या जीएनयू / लिनक्स का उपयोग करते हैं, उन पुस्तकों को लिखने वाले नहीं हैं। एक गैर-विहित पथ रिश्तेदार को बुलाने का उदाहरण मुझे वास्तव में बुरा और स्पष्ट लगता है। man7.org/linux/man-pages/man3/realpath.3.html (और realpath(1)) दोनों काम करते हैं: canonicalize और निरपेक्ष बनाते हैं (साथ ही साथ सहानुभूति का पालन भी करते हैं), इसलिए संभवतः कुछ भ्रम की स्थिति पैदा होती है।
पीटर कॉर्डेस

2
फिर भी, वे मेरे लिए बस सामान्य रोजमर्रा की अवधारणाएं हैं। मुझे लगता है कि कागज का एक टुकड़ा होना अजीब होगा जिसने कहा कि मैं उन्हें जानता था ... लेकिन शुभकामनाएँ कि आपके कागज का टुकड़ा, @hiteWinterWolf हो रहा है, उन सभी लोगों को दिखाने के लिए जो कागज के टुकड़ों को देखना पसंद करते हैं। :)
पीटर कॉर्ड्स

48

यह अनिवार्य रूप से शब्दों की परिभाषा के बारे में एक प्रश्न है। तो अपने उद्देश्यों के लिए, उत्तर जो कुछ भी एलपीआईसी चाहता है। लेकिन हम तकनीकी तथ्यों के आधार पर कुछ निष्कर्ष पर आ सकते हैं:

यदि आप '~/Documents'एक सिस्टम कॉल में पास हुए हैं , तो यह ~वर्तमान निर्देशिका में बिल्कुल नाम वाली निर्देशिका की तलाश करेगा (और शायद विफल हो जाएगा)। तो, कर्नेल द्वारा उपयोग किए गए पथनामों की धारणा से , यह एक सापेक्ष पथ है - लेकिन इसका मतलब यह नहीं है।

~शेल द्वारा कार्यान्वित वाक्यविन्यास है (और अन्य प्रोग्राम जो इसे सुविधा के लिए अनुकरण करते हैं) जो इसे एक वास्तविक पथनाम में विस्तारित करता है। वर्णन करने के लिए, ~/Documentsलगभग एक ही चीज़ है $HOME/Documents(फिर से, शेल सिंटैक्स)। चूँकि $HOMEएक निरपेक्ष पथ होना चाहिए, का मान $HOME/Documents भी एक निरपेक्ष पथ है। लेकिन पाठ का विस्तार करना है $HOME/Documentsया ~/Documentsखोलना है ताकि हम जो रास्ता चाहते हैं वह बन जाए।

इस प्रकार यदि मैं सटीक और सुसंगत होना चाहता था, तो मैं कहूंगा कि ~/Documentsयह शेल-स्क्रिप्ट का एक टुकड़ा है जो एक निरपेक्ष पथ पर फैलता है।


बेशक, कर्नेल का कोई $HOMEमतलब नहीं होगा , जैसे कि ~इसका कोई मतलब नहीं है। हालाँकि मुझे यह दावा मिलता है कि ~ विस्तार संदिग्ध होने के लिए शेल द्वारा किया जाता है; अधिकांश अनुप्रयोग इसका समर्थन करते हैं, जो शेल के बजाय C लाइब्रेरी की ओर इंगित करता है। वातावरण चर विस्तार तथापि है खोल की एक विशेषता; आप ~/somefile.odtलिबरऑफिस में खोल सकते हैं , लेकिन नहीं $HOME/somefile.odt, भले ही लिबरऑफिस को एक शेल से शुरू किया गया हो जिसके भीतर $ HOME ठीक से सेट किया गया हो।
एक CVN

5
आप यह सब आप चाहते हैं संदिग्ध मिल सकता है, लेकिन यह प्रलेखित है और सी। में पुष्टि करना या अस्वीकृत करना आसान होना चाहिए
बेकार

6
अन्य प्रोग्राम ~शेल की नकल में वाक्य रचना को लागू करते हैं, क्योंकि यह एक उपयोगी शॉर्टकट है। मैं वास्तव में नहीं जानता कि क्या कोई लाइब्रेरी फ़ंक्शन है जो विस्तार करता है, लेकिन यह निश्चित रूप से कुछ ऐसा है जो वास्तव में pathname का उपयोग करके अलग से किया जाता है।
केविन रीड

2
globऔर wordexpअन्य चीजों के बीच में विस्तार करें।
o11c

2
@ माइकलकॉर्जलिंग: कुछ कार्यक्रम ~विस्तार को लागू करते हैं ; सबसे नहीं। उदाहरण के लिए, यदि आप टाइप करते हैं ls -l ~, तो lsप्रोग्राम कभी भी ~चरित्र नहीं देखता है ; इसे शेल द्वारा विस्तारित किए जाने से पहले विस्तारित किया गया lsहै। यदि आप वास्तव में इसे पास करते ~हैं ls, तो यह इसे विशेष रूप से व्यवहार नहीं करेगा; कोशिश करें ls -l '~`` (जो शाब्दिक रूप से नामित फ़ाइल को सूचीबद्ध करने का प्रयास करेगा ~)।
कीथ थॉम्पसन

16

यदि आपका $HOMEहै /home/white/, ~/Documents(उसी के रूप में $HOME/Documents) शेल द्वारा विस्तार किया गया है ( स्पष्टीकरण के लिए यहां देखें ) /home/white/Documents, जो एक निरपेक्ष पथ है।

एक सापेक्ष पथ वह है जो एक /(शेल विस्तार के बाद) से शुरू नहीं होता है , जैसे ../Documentsयाfoo/bar

कुछ पुराने गोले का विस्तार नहीं है ~(वैसे bash, tcsh, zsh, आदि ... करना); वे ~/Documentsएक रिश्तेदार मार्ग से शुरू होते हुए देखेंगे ~; लेकिन आपके पास आमतौर पर निर्देशिका का नाम नहीं है ~(लेकिन आप ऐसा बना सकते हैं mkdir '~', जिसकी मैं अनुशंसा नहीं करता)।


आपको उल्लेख करना चाहिए कि किन गोले का विस्तार नहीं हुआ है~
एडवर्ड टॉर्वाड्स

3

एक निरपेक्ष पथ पर शुरू होता है /(जो इसे संदर्भित करता है निर्धारित है), एक रिश्तेदार पथ वर्तमान निर्देशिका में शुरू होता है (और इसलिए इसे वर्तमान निर्देशिका में परिवर्तन के रूप में संदर्भित करता है)। अधिकांश गोले ~वर्तमान उपयोगकर्ता की होम डायरेक्टरी के निरपेक्ष पथ के लिए एक संक्षिप्त नाम के रूप में शुरुआत में उपयोग करते हैं , यानी वर्तमान उपयोगकर्ता के घर में ~/Documentsनिर्देशिका Documentsहै, भले ही वर्तमान निर्देशिका क्या हो। तो यह एक परम मार्ग है।


1

उपयोगकर्ता कौन है इसके आधार पर पथ भिन्न स्थान पर विस्तारित हो सकता है। यह कहते हुए कि, यह मेरी राय में अभी भी एक निरपेक्ष मार्ग है, रिश्तेदार मार्ग नहीं है। हालाँकि, मुझे नहीं लगता कि निरपेक्ष और सापेक्ष पथ की परिभाषाएँ इतनी सटीक रूप से परिभाषित हैं। यह गणित नहीं है। यह प्रश्न वास्तव में समझ का परीक्षण नहीं करता है, मेरी राय में, और व्यर्थ है।


परिभाषा राय से बहुत अधिक है। विकिपीडिया सामान्य मामले के लिए, यूनिक्स ही नहीं, इसके लिए एक छुरा लेता है: en.wikipedia.org/wiki/…
पीटर कॉर्ड्स

1

शुरुआत में ~ / का उपयोग पथ को पूर्ण बनाता है क्योंकि (किसी भी परिभाषा से) दस्तावेज़ों को खोजने में सक्षम होने के कारण यह निर्भर नहीं करता है कि आप वर्तमान में कहां हैं। हालाँकि विस्तार शेल द्वारा किया जाता है, कर्नेल के द्वारा नहीं, इसलिए यदि आप एक ऐसे शेल का उपयोग कर रहे हैं जो इस सिंटैक्स को नहीं पहचानता है (जैसे / बिन / श, मूल बॉर्न शेल, बैश उर्फ ​​नहीं), तो आप इससे बाहर हो जाएंगे भाग्य।

दिलचस्प है, अगर आप ~ रूट / ~ के बजाय का उपयोग करते हैं, तो $ HOME पढ़ने का अनुकूलन आमतौर पर लागू नहीं होता है और यह हमेशा एक निरपेक्ष का समाधान करेगा यदि / etc / passwd सही है।


-1

पुस्तक इस विचार को लेती हुई प्रतीत होती है कि एक निरपेक्ष पथ किसी भी पथ की शुरुआत है /, और एक सापेक्ष मार्ग कुछ और है।

आप देख सकते हैं ..और $HOMEइसी प्रकार के टोकन के रूप में। पथ घटक के लिए दोनों को प्रतिस्थापित करने की आवश्यकता होती है, इससे पहले कि पथ एक निरपेक्ष पथ पर हल हो जाए।


3
कैसा है ..कुछ $HOME? ..एक सिस्टम कॉल पर सीधे पास किए गए पथ की शुरुआत में हो सकता है, शेल विस्तार की आवश्यकता नहीं है। इस तरह के एक मार्ग है नहीं एक निरपेक्ष पथ; यह अभी भी प्रक्रिया सीडब्ल्यूडी या सिमलिंक स्थान के सापेक्ष है। जब तक कि लेखक पथ के रूप में उस शाब्दिक स्ट्रिंग (शेल विस्तार के बिना) के बारे में बात करके आपको पकड़ने की कोशिश कर रहा था। मुझे लगता है कि आप पुस्तक के लिए बहाने बनाने की कोशिश कर रहे हैं, लेकिन मैं सिर्फ यह कहना चाहूंगा कि यह गलत है और चीजों को गड़बड़ नहीं होने देना चाहिए।
पीटर कॉर्ड्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.