पथ वाक्यविन्यास नियम


10

मैं हेरफेर के लिए एक पुस्तकालय लिख रहा हूँ यूनिक्स पथ तार। यह मामला होने के नाते, मुझे सिंटैक्स के कुछ अस्पष्ट कोनों को समझने की आवश्यकता है जिनके बारे में ज्यादातर लोग चिंता नहीं करेंगे।

उदाहरण के लिए, जैसा कि सबसे अच्छा मैं बता सकता हूं, ऐसा लगता है कि foo/barऔर foo//barदोनों एक ही स्थान पर इंगित करते हैं।

इसके अलावा, ~आमतौर पर उपयोगकर्ता के होम डायरेक्टरी के लिए खड़ा होता है, लेकिन क्या होगा अगर यह एक मार्ग के बीच में दिखाई देता है ? फिर क्या होता है?

इन और कई दर्जन अन्य अस्पष्ट सवालों के जवाब देने की आवश्यकता है अगर मैं कोड लिखने जा रहा हूं जो हर संभव मामले को सही ढंग से संभालता है। क्या किसी को एक निश्चित संदर्भ के बारे में पता है जो इस सामान के सटीक वाक्यविन्यास नियमों की व्याख्या करता है ?

(दुर्भाग्य से, "यूनिक्स पाथ सिंटैक्स" जैसे शब्दों की खोज करने से बस एक लाख पृष्ठों पर चर्चा होती है जो $PATHचर पर चर्चा कर रहा है ... हेक, मैं इस प्रश्न के लिए उपयुक्त टैग खोजने के लिए भी संघर्ष कर रहा हूं!)


ओके ~ टिल्डे और -फिलनेम विस्तार किसी भी यूनिक्स वातावरण की POSIX परिभाषित विशेषताएं अंतर्निहित हैं। कुछ सुझाव: एक फ़ाइल नाम कुछ भी हो सकता है, लेकिन \ 0 या /। ////// और / एक ही बात है। $ PWD को कर्नेल में संभाला जाता है और इसे / proc में किसी भी (Linux) प्रक्रिया के लिए पढ़ा जा सकता है । /./ केवल एक पथ के मूल में हो सकता है। $ पेट में ::::: और: एक ही बात है। / dev / null / dev / tty और / tmp प्रत्येक अनुरूप प्रणाली के लिए POSIX गारंटीकृत मार्ग हैं।
mikeserv

1
आपके अधिकांश प्रश्न (लेकिन इसके बारे में हिस्सा नहीं ~) को कवर किया गया है कि कैसे linux कई पथ विभाजकों (/ home //// उपयोगकर्ता नाम ///) को संभालता है । एक आदर्श संदर्भ के लिए निकटतम बात पोसिक्स या एकल यूनिक्स विनिर्देश होगी - आसान पढ़ना नहीं।
गिल्स एसओ- बुराई को रोकना '

जवाबों:


13

पथ तीन प्रकार के होते हैं:

  • संबंधित पथ की तरह foo, foo/bar, ../a, .। वे /उस पथ के साथ सिस्टम कॉल करने की प्रक्रिया की वर्तमान निर्देशिका के साथ शुरू नहीं करते हैं और संबंधित नहीं हैं।
  • जैसे पूर्ण पथ /, /foo/barया ///x। वे 1, या 3 या अधिक के साथ शुरू /करते हैं, वे सापेक्ष नहीं हैं, /मूल निर्देशिका से शुरू होते हुए देखे जाते हैं।
  • POSIX //fooको विशेष रूप से इलाज करने की अनुमति देता है, लेकिन यह निर्दिष्ट नहीं करता है कि कैसे। कुछ सिस्टम नेटवर्क फ़ाइलों जैसे विशेष मामलों के लिए उपयोग करते हैं । यह ठीक 2 स्लैश होना है।

शुरुआत के अलावा, स्लैश के क्रम एक की तरह काम करते हैं।

~केवल शेल के लिए विशेष है , यह शेल द्वारा विस्तारित है, यह सिस्टम के लिए बिल्कुल भी विशेष नहीं है। इसका विस्तार कैसे किया गया यह शेल डिपेंडेंट है। गोले अन्य प्रकार के विस्तार जैसे ग्लोबिंग ( *.txt) या चर विस्तार /$foo/$barया अन्य। जहां तक ​​प्रणाली का संबंध ~fooहै, जैसे एक सापेक्ष पथ _fooया है foo

ध्यान रखने योग्य बातें:

  • foo/जैसा है वैसा नहीं है foo। यह अधिकांश सिस्टम कॉल पर अधिकांश सिस्टम कॉल के लिए (विशेषकर यदि सिम्लिंक है) के करीब foo/.है foo( हालांकि जैसा है)।foofoo//foo/
  • a/b/../cजरूरी नहीं है कि a/c(उदाहरण के लिए अगर a/bसिमिलिंक है)। सबसे अच्छा इलाज के लिए नहीं है ..
  • यह आमतौर पर हालांकि के a/././././bरूप में ही विचार करने के लिए सुरक्षित है a/b

तो सारांश में, अगर मैं खोल पथ हेरफेर के बारे में परवाह नहीं है (जो विशाल है और जटिल), मैं केवल बारे में परवाह करने की जरूरत है /, .और ..(?)
MathematicalOrchid

//fooहैंडलिंग का एक उदाहरण सिग्विन में है, जहां इसका उपयोग UNC रास्तों के लिए किया जाता है । यही है, //server/share/dir/file.txtएक कानूनी रास्ता है जो डिफ़ॉल्ट रूप से ऑफ-सिस्टम को इंगित करता है। Cygwin स्थानीय प्रणाली को देखने के लिए वापस गिर जाता है अगर यह नहीं मिल सकता है server
वॉरेन यंग

3

उदाहरण के लिए, जैसा कि सबसे अच्छा मैं बता सकता हूं, ऐसा लगता है कि फू / बार और फू // बार दोनों एक ही स्थान पर इंगित करते हैं।

हाँ। यह आम है क्योंकि सॉफ्टवेयर कभी-कभी एक पथ को समाप्‍त कर देता है, यह मानते हुए कि पहले भाग को आगे की स्‍लैश के साथ समाप्‍त नहीं किया गया था, इसलिए एक को सुनिश्चित करने के लिए फेंक दिया जाता है (मतलब दो या दो से अधिक होने का अर्थ हो सकता है)। foo///barऔर foo/////barभी उसी जगह की ओर इशारा करते हैं foo/bar। पथ हेरफेर लाइब्रेरी के लिए एक अच्छा कार्य वह होगा जो किसी भी क्रमिक स्लैश की संख्या को एक तक कम कर देता है (एक पथ की शुरुआत को छोड़कर, जहां इसका उपयोग URL-ish तरीके से किया जा सकता है, या, जैसा कि स्टीफन बताते हैं, किसी के लिए भी अनिर्दिष्ट विशेष प्रयोजन)।

इसके अलावा, ~ आमतौर पर उपयोगकर्ता के घर निर्देशिका के लिए खड़ा है

यह परिवर्तन शेल और टिल्ड एक्सपेन्शन के माध्यम से किया जाता है , जो केवल तभी काम करता है जब यह पथ का पहला चरित्र हो। आपको इससे निपटने की आवश्यकता है या नहीं, यह संदर्भ पर निर्भर करता है। यदि लाइब्रेरी का उपयोग सामान्य कार्यक्रमों के साथ किया जाना है जो प्राप्त करते हैं, उदाहरण के लिए, कमांड लाइन तर्क जिसमें एक पथ होता है, टिल्ड विस्तार पहले से ही किया जाता है जब वे पथ देखते हैं। केवल एक ही स्थिति मैं देख सकता हूँ यह एक चिंता का विषय है यदि आप एक पाठ फ़ाइल से सीधे पथ प्रसंस्करण कर रहे हैं।

इसके अलावा, ~एक कानूनी चरित्र * निक्स पथ में है और इसे किसी अन्य चीज़ में नहीं बदला जाना चाहिए। इसके अनुसार , केवल ऐसे अक्षर जो यूनिक्स फ़ाइल नाम में कानूनी नहीं हैं /(क्योंकि यह पथ विभाजक है) और "अशक्त" (उर्फ। एक शून्य बाइट) क्योंकि वे आम तौर पर पाठ में अवैध हैं।


टिल्ड विस्तार की व्याख्या के लिए +1; मुझे नहीं पता था कि आप इसके साथ अन्य उपयोगकर्ताओं को संदर्भित कर सकते हैं !
गणितीयऑक्रिड

2
जैसा कि स्टीफन कहते हैं, आप सभी बार-बार आगे की स्लैश को आँख बंद करके नहीं कर सकते। पथ की शुरुआत में कई आगे की स्लैश को ध्यान से इलाज किया जाना है।
वॉरेन यंग

@ArrenYoung ने इसे स्पष्ट करने के लिए संपादन किया। पुनश्च। आगे??! O_O
गोल्डीलॉक्स

बेहतर, हालांकि मैं यह नहीं कहूंगा कि इसका URL से कोई लेना देना है। UNC 1980 के दशक के अंत में वापस चला गया, जबकि URL वर्षों बाद तक दिखाई नहीं दिए।
वारेन यंग

@WarrenYoung मेला पर्याप्त है, हालांकि ऐसा लगता है कि UNC MS प्लेटफ़ॉर्म के लिए विशिष्ट है , इसलिए //तकनीकी रूप से भी ऐसा नहीं है। URLS और नए, के अनुसार SC- के लिए स्वतंत्र रूप से अस्पष्ट POSIX कल्पना इस तरह से प्राप्त की गई // हो सकती है, जिस स्थिति में "URL-ish" कन्वेंशन के लिए एक उपयुक्त लेबल लगता है (भले ही UNCs पुराना हो, और यहां तक ​​कि अगर समानता हो अनजाने में) है। मैं कहूंगा कि कभी नहीं है कि "वे यूआरएलों कर रहे हैं", केवल कि //या \\ एक "यूआरएल-ish" उद्देश्य में कार्य करता।
गोल्डीलॉक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.