एक निर्देशिका पथ चर एक अनुगामी स्लेश के साथ समाप्त होना चाहिए?


85

एक चर या स्थिर के रूप में एक निर्देशिका के लिए एक मार्ग को परिभाषित करते समय, क्या यह एक अनुगामी स्लेश के साथ समाप्त होना चाहिए? अधिवेशन क्या है?

pwdयूनिक्स में अपनी वर्तमान निर्देशिका को एक अनुगामी स्लैश के बिना दिखाया गया है, जबकि टैब के पूर्ण में cd /var/www/apps/अनुगामी स्लैश शामिल है, जिसने मुझे अनिश्चित बना दिया।

जवाबों:


23

जब मैं उदाहरण के लिए अनुगामी स्लैश को शामिल नहीं करता हूं, तो फ़ाइलों को संग्रहीत करने के लिए निर्देशिका को परिभाषित करें। ऐसा इसलिए है क्योंकि मैं इसका इस्तेमाल करूंगा

$store_file = "$store_path/$file_id";

मैं हमेशा चर पथ का उपयोग करने से पहले एक निर्देशिका पथ को रखने के लिए एक अनुगामी स्लैश जोड़ूंगा। मुझे लगता है कि यदि अनुगामी स्लैश को शामिल किया जाए तो आश्चर्यचकित होने की तुलना में हमेशा जोड़ना बेहतर होगा।


29
अनुगामी स्लैश न होने का अर्थ है कि इसकी स्पष्टता यदि $ store_path में पथ फ़ाइल या निर्देशिका है। "" tmp / store_data "क्या यह फ़ाइल या निर्देशिका है?
डार्विन

4
PHP के realpath () फ़ंक्शन जैसी किसी चीज़ का उपयोग करते समय, यह अनुगामी स्लैश को प्रिंट नहीं करेगा। आपका सिस्टम और उपकरण आपके सम्मेलन को निर्देशित कर सकते हैं।

10
कहीं भी कई स्लैश होने से आमतौर पर एक स्लैश के रूप में व्याख्या की जाएगी। तो आप भी कुछ पसंद कर सकते हैं '///' + $root + '//' + $file + '/'और यह बात नहीं होगी। हालांकि पीछे चल रहा स्लैश एक अच्छा तरीका है कि यह पता लगाने के लिए कि रास्ता एक फ़ाइल या निर्देशिका है या नहीं, यह बेहतर होगा कि आप पथ के '/' + $rootबजाय जैसे $root + '/'कि आप सकारात्मक नहीं हो सकते हैं, पथ को एक कठिन स्लैश करने के लिए जोड़ा जा सकता है। , लेकिन आपको अपेक्षाकृत आश्वस्त किया जा सकता है कि अधिकांश वातावरण में एक ही स्लैश के रूप में कई स्लैश की व्याख्या की जाएगी।
शूल

3
@MatthewSlyman, मेरी बात यह थी कि हर कोई यह उम्मीद करता है कि यह /tmp/store_data/एक निर्देशिका होगी, जबकि इसकी स्पष्टता नहीं है कि ट्रालिंग स्लैश के बिना एक ही रास्ता क्या है/tmp/store_data
डार्विन

6
इसके साथ समस्या यह है: यदि कोई चर मौजूद नहीं है, तो यह खाली के समान है, और rm -rf $foo/$barसमाप्त हो सकता हैrm -rf /
12431234123412341234123

100

मैं पीछे चल रही स्लैश के साथ जाता हूं क्योंकि:

  1. "अगर यह एक स्लैश के साथ समाप्त होता है, तो यह एक निर्देशिका है। यदि नहीं, तो यह एक फ़ाइल है।" याद करने के लिए एक आसान सम्मेलन है।

  2. कम से कम ऑपरेटिंग सिस्टम पर मैं आमतौर पर उपयोग करता हूं, स्लैश को दोगुना करने से कोई समस्या नहीं होती है, जबकि स्लैश को छोड़ना बड़े लोगों का कारण बनता है। इसलिए, यह सबसे सुरक्षित है कि दोनों स्लैश को चर में डाल दें और इसका उपयोग करते समय "$ पथ / $ फ़ाइल" का उपयोग करें।


9
निर्देशिका पथ केवल एक फ़ाइल पथ से भिन्न होता है यदि निर्देशिका पथ में अनुगामी स्लैश है।
डार्विन

4
एकाधिक स्लैश एक स्लैश के बराबर होते हैं, जब तक कि पथ डबल स्लैश से शुरू नहीं होता है। देखें unix.stackexchange.com/questions/1910/…
jdh8

4
इसके अतिरिक्त वैरिएबल के अंत में स्लैश को जोड़ने से "$ पाथ $ फाइल" के बजाय "$ पाथ / $ फाइल" की अनुमति मिलती है, जो खाली $ पथ के लिए अनुमति देता है - जिसका अर्थ है वर्तमान कार्यशील निर्देशिका। लेकिन स्लैश के बजाय कभी बैकस्लैश का उपयोग न करें।
फंतासी

फ़ाइल विवरणक उपयोगी भी हैं
फ्रांसेस्को गुआलाज़ी

@ jdh8 भले ही पथ डबल स्लैश के साथ शुरू होता है, यह अभी भी एक स्लैश के बराबर होना चाहिए। हालांकि यह कार्यान्वयन से कार्यान्वयन में बदल सकता है। यूनिक्स मानक बताते हैं कि A pathname that begins with two successive slashes may be interpreted in an implementation-defined manner, although more than two leading slashes shall be treated as a single slash.अधिकांश भाग के लिए यह देखा गया है कि आम तौर पर दोहरे स्लैश की व्याख्या आम कार्यान्वयन में एकल स्लैश के रूप में की जाती है।
२१

11

मुझे पता है कि यह 10 साल पुराना है, लेकिन मैं अपनी बहुत ही $ 0.02 की राय में फेंकना चाहता था।

सं। सं।

हम एक यूनिक्स प्रणाली के बारे में बात कर रहे हैं। निर्देशिका के संदर्भ में, यह किसी भी अन्य की तरह एक नोड है। जब निर्देशिका की चर्चा करते हुए, यह कभी अपने नाम में कोई अनपेक्षित स्लैश नहीं होना चाहिए (संदर्भ: dirname, pwd, ~, echo $HOME, echo $PATH, से उत्पादनls , एट अल)।

जब निर्देशिका की सामग्री का जिक्र किया जाता है, तो आपको एक स्लैश की आवश्यकता होती है। यह कहना है, ls /home/karl/की तुलना में अधिक उपयुक्त हैls /home/karl (FTR, मैं लगभग हमेशा बाद में करता हूं क्योंकि ... अच्छी तरह से, आलसी)।

किसी फ़ाइल में पूर्ण पथ बनाने के लिए निर्देशिका वाले चर का उपयोग करते समय, आप हमेशा स्लैश (i।, E) को शामिल करने की अपेक्षा करेंगे। cp ${HOME}/test ${OTHER_DIR}/

यह उम्मीद की जाती है कि एक निर्देशिका स्लैश में समाप्त न हो। किसी भी उम्मीद है कि एक निर्देशिका एक स्लैश में समाप्त होती है गलत है। इस प्रकार एक के अंत में एक स्लैश जोड़ना*_DIR चर के मूल्य उम्मीदों को कम कर देगा।

टैब के पूरा होने के रूप में, यहाँ अपेक्षा यह है कि आप उस निर्देशिका में जा रहे हैं । इस प्रकार, टैब पूर्णता द्वारा प्रदान की गई सहायता आपको उस निर्देशिका में लाने के लिए है ताकि आप इसकी सामग्री के आधार पर अगली पसंद कर सकें।

(टिप्पणियों से संदर्भ: विकिपीडिया के पृष्ठ से फ़ाइलपथ गलतफहमीTalk:Path_(computing) । धन्यवाद, जॉन सी.जे. )

यह ध्यान देने योग्य है कि सिर्फ इसलिए कि यह गलत है इसका मतलब यह नहीं है कि उपकरण / पैकेज / लाइब्रेरी कभी भी ऐसा नहीं करते हैं। यह बहुत दूर की घटना है कि जब कोई भी मौजूद नहीं होना चाहिए, तो इस तरह की चीजें बहुत पीछे चल रही हैं। इसलिए, बेवन और पॉल एफ के रूप में दोनों ने सुझाव दिया, जब तीसरे पक्ष के उपकरण का उपयोग करते हुए, किसी भी अनुगामी स्लैश को हटाना सबसे अच्छा है जो निर्देशिका नामों में मौजूद हो सकता है।

यूनिक्स आईनोड

इनोड (इंडेक्स नोड) एक यूनिक्स-शैली फ़ाइल सिस्टम में एक डेटा संरचना है जो फ़ाइल या निर्देशिका जैसे फ़ाइल सिस्टम ऑब्जेक्ट का वर्णन करता है।

- https://en.wikipedia.org/wiki/Inode

फाइलसिस्टम पदानुक्रम मानक

यूनिक्स फाइल सिस्टम (फ़ाइल-सिस्टम अनुक्रम स्टैंडर्ड, उर्फ FHS) के लिए मानक स्पष्ट रूप से पता चलता है कि निर्देशिका के बारे में सोचा नहीं कर रहे हैं स्लैश होने के रूप में, बल्कि निर्देशिका सामग्री एक स्लैश के साथ शुरू होता है (इसका एकमात्र अपवाद नहीं है /क्योंकि हम का उल्लेख नहीं होगा एक खाली स्ट्रिंग का उपयोग करके फाइल सिस्टम रूट ... और किसी को भी कभी भी वहां फाइलें नहीं बनानी चाहिए। "

- http://www.pathname.com/fhs/pub/fhs-2.3.html

- https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard


बहुत बढ़िया जवाब। मैं इस दृष्टिकोण का उपयोग करने के लिए तैयार हूं, लेकिन मेरे तर्क के अनुसार कभी भी पूरी तरह से पूरा नहीं हुआ। यह एकमात्र उत्तर है कि यह नाखून।
वार्ड

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

समझा। Dirname के साथ थोड़ा सा खेल लिया। यदि आप किसी पथ में किसी निर्देशिका को स्पष्ट रूप से संग्रहीत करने का इरादा रखते हैं, तो पथ को "/" के साथ समाप्त करें, जहां डॉट वर्तमान निर्देशिका का प्रतिनिधित्व करता है।
TamusJRoyce

आप एक के साथ कभी खत्म नहीं होंगे /., यह सिर्फ एक भयानक विचार है; बहुत ही असामान्य सामग्री को इंजेक्शन लगाने के अलावा, अप्रत्याशित परेशानी का कारण बनता है, यह सिर्फ सादा मूर्खतापूर्ण दिखता है।
कार्ल विल्बर

2
@wardw आप रूट निर्देशिका को खाली स्ट्रिंग के रूप में सोच सकते हैं, जबकि "/" एक खाली स्ट्रिंग है जिसके बाद एक स्लैश है और इसका अर्थ है "रूट निर्देशिका की सामग्री"।
bobpaul

9

हाँ, यह होना चाहिए:

Pathname + फ़ाइल नाम = पूरी तरह से योग्य फ़ाइल स्थान।

तो अंतिम निर्देशिका और फ़ाइल नाम के बीच स्लैश को पाथनाम के अंत में या फ़ाइल नाम की शुरुआत में होना चाहिए। यदि आप किसी फ़ाइल को खोलना चाहते हैं (यानी यदि आप यह मानते हैं कि अयोग्य फ़ाइलनाम वर्तमान कार्य निर्देशिका में है) तो / / के साथ फाइलिंग प्रीफ़ेन्शन को ध्यान में रखना होगा।


5
.. और इसे ध्यान में रखने का मतलब है कि आप अनजाने में / के साथ खिलवाड़ कर रहे हैं, और इस तरह पागलपन झूठ है
JustJeff

5

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

परिशिष्ट :
यह उन विधियों का उपयोग करने के विकल्प के रूप में नहीं है जो एक अनुगामी स्लेश या उसकी अनुपस्थिति को सहन कर सकते हैं। यहां तक ​​कि इस सम्मेलन का उपयोग करते हुए मैं अभी भी हमेशा Path.Combine(...)और इसी तरह के तरीकों का उपयोग करता हूं ।


अजगर:os.path.join(dir, subdir_or_file)
आइसडॉर

5

शायद आपको यह सोचना चाहिए कि फाइलों के लिए आपके फैसले का क्या मतलब होगा। यदि आप एक निर्देशिका नाम के अंत में अनुगामी स्लैश को शामिल नहीं करते हैं, तो आपको इसे फ़ाइल नाम की शुरुआत में जोड़ना होगा ।

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

इसलिए मैं अपने रास्ते को एक स्लैश के साथ समाप्त करता हूं और फाइलों को फाइलों के रूप में रखता हूं।


1
यहाँ विकल्प के रूप में अपना फ़ाइल नाम व्यक्त करना है ./filename। लेकिन सामान्य तौर पर यह कोड की जिम्मेदारी होनी चाहिए कि वे इसे ठीक से करने के लिए रास्तों को समतल करें - और किसी भी तरह से धारणा न बनाएं।
वार्ड

4

मुझे पता है कि यह एक पुराना धागा है लेकिन मुझे लगा कि मैं जो करूंगा उसे साझा करूंगा। यदि संभव हो तो, मैं सामान्य रूप से दोनों के लिए अनुमति देता हूं और ऐसा कुछ करता हूं (यदि यह PHP था):

$fullPath = rtrim($directory, '/') . '/filename.txt');

इस तरह, यदि निर्देशिका को एक विन्यास फाइल में परिभाषित किया गया है, तो इससे कोई फर्क नहीं पड़ता कि अगले व्यक्ति को इसे बदलना है या नहीं, जिसमें पीछे चल रहा स्लैश शामिल है या नहीं।


4

Php में, चूंकि dirname (__ FILE __) फ़ंक्शन निर्देशिका नाम को बिना स्लैश के देता है। मैं उस अधिवेशन में जाने को तैयार हूं।

अन्यथा, निर्देशिका नाम के अंत में एक स्लैश का उपयोग करने से dirname (..) के काम करने के तरीके के साथ संघर्ष होगा और फिर आप दो मामलों को संभालने के साथ अटक जाते हैं क्योंकि आप नहीं जानते कि क्या निर्देशिका नाम dirname (.. से आया है) ) समारोह या एक सामग्री एक अनुगामी स्लेश के साथ परिभाषित।

निचला रेखा: dirname (..) के बाद से ट्रेलिंग स्लैश का उपयोग न करें।

// PHP Example
dirname(__FILE__); // returns c:\my\directory without a trailing slash, so stick to it!

अन्य भाषाओं के लिए, उस फ़ंक्शन की जाँच करें जो एक pathname निकालता है, और देखें कि क्या यह एक अनुगामी स्लैश का उपयोग कर रहा है या नहीं, फिर भाषा के अधिवेशन से चिपके रहें।


2
एक अपवाद: dirname ('/ test') = '/' - खाली स्ट्रिंग लौटने के बजाय, dirname इस मामले में एक ही स्लैश लौटाता है! नोट यहाँ देखें ।
मैथ्यू Slyman

3

मैं केवल अनुगामी स्लैश जोड़ना चाहता हूं क्योंकि मैं उस निर्देशिका का उपयोग करने की संभावना से अधिक हूँ ताकि फ़ाइलों को जोड़ / पुनः प्राप्त कर सकूं ...

वेब रेफ़रिंग के संदर्भ में, यह वास्तव में प्रदर्शन को बढ़ा सकता है और पीछे चल रही स्लैश को छोड़ सकता है

http://www.netmechanic.com/news/vol4/load_no11.htm


2

हां, बहुत सारे फाइल सिस्टम हैं जो बिना किसी एक्सटेंशन के फाइलों का समर्थन करते हैं, इसलिए किसी भी समस्या से बचने के लिए हमेशा ट्रेलिंग स्लैश जोड़ें।


1

मैंने कभी किसी तरह से एक दृढ़ सम्मेलन नहीं देखा।

बहुत यकीन है, हालांकि, कि आप जो भी तय करते हैं, कोई और 100% सुनिश्चित होगा कि यह दूसरा तरीका होना चाहिए। इसलिए, सबसे अच्छा विचार यह है कि किसी भी तरह से सेट की जा रही चीजों को सहन करें।

.NET की दुनिया में, Path.Combine () आपको इसे संभालने का एक तरीका देता है - ऊपर के cmd फ़ाइलों से, अन्य वातावरण में समतुल्य हैं।


1

मुझे लगता है कि यह उन दुर्लभ मामलों में से एक है जहां सही सैद्धांतिक और व्यावहारिक रूप से उत्तर अलग है।

ऐसा लगता है कि @Karl Wilbur का जवाब निश्चित रूप से एक सैद्धांतिक अर्थ में सही है, क्योंकि आपको निर्देशिका के कंटेंट से डायरेक्टरी नोड के संदर्भ को अलग करने में सक्षम होना चाहिए।

लेकिन व्यवहार में मैं तर्क दूंगा कि सही उत्तर इसके विपरीत है:

  • सबसे महत्वपूर्ण कारण यह है कि आप निश्चितता के साथ बता सकते हैं कि मार्ग /home/FSObjectX/एक फ़ोल्डर है, जबकि /home/FSObjectXअस्पष्ट है। कोई बता नहीं सकता कि यह फ़ोल्डर की फाइल है या नहीं।
    जब भी संभव हो विनिर्देशों विशिष्ट और सटीक होना चाहिए।

  • अधिकांश मामलों में, आप हमेशा फ़ोल्डर की सामग्री का संदर्भ लेंगे, न कि स्वयं डीआईआर नोड के।
    उन दुर्लभ मामलों में जहां आप वास्तव में करते हैं, इसे आसानी से किसी भी वैकल्पिक अनुगामी डाइर-विभाजक को हटाकर कोड में संभाला जा सकता है।

  • डबल डीर-सेपरेटर का उपयोग करने से कोई नुकसान नहीं होगा, हालांकि यह सुनिश्चित करने के लिए लापता होगा।
    सिद्धांत रूप में एक बुरा तर्क "मौका" द्वारा कोड नहीं होना चाहिए, लेकिन व्यवहार में, त्रुटियां होती हैं, और शायद अनुगामी dir-sep का उपयोग करके अंत उपयोगकर्ता पर कुछ कम रनटाइम त्रुटियों के साथ समाप्त हो सकता है।

इस दिलचस्प सूत्र के माध्यम से पढ़ने पर मुझे dir-sep का उपयोग करने का कोई नुकसान नहीं मिला, केवल यह कि यह एक सैद्धांतिक अर्थ में गलत है। या किसी को याद किया था?


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