क्या निर्देशिका नामों में आगे पीछे होने वाले स्लैश की आवश्यकता है?


9

मैं तर्क के रूप में एक निर्देशिका पथ को पारित करने के लिए मेरी बैश स्क्रिप्ट के उपयोगकर्ता से पूछना चाहता हूं। निम्नलिखित में से कौन सा एक अच्छा प्रोग्रामिंग अभ्यास है?

  • आवश्यकता है कि उपयोगकर्ता एक अनुगामी / (आगे स्लैश) दर्ज करें
  • आवश्यकता है कि एक उपयोगकर्ता एक अनुगामी / (आगे स्लैश) दर्ज न करे

3
ध्यान दें कि rsyncअनुगामी की उपस्थिति के आधार पर एक बहुत ही महत्वपूर्ण तरीके से व्यवहार करता है /, और इसलिए कुछ मामलों में आप स्थिरता के लिए सामान्य करना चाहते हैं, और अन्य में आप उपयोगकर्ता द्वारा कही गई बात को लागू करने के लिए सफाई से गुजरना चाहते हैं (यदि वे पता था कि वे बात कर रहे थे rsync)।
sh1

एक और एक है कि मुझे हाल ही में आश्चर्य है कि है ls -l dirबर्ताव के लिए अलग तरह ls -l dir/अगर dirएक निर्देशिका में एक सिमलिंक है।
फ्लिम्स

जवाबों:


27

सबसे अच्छा अभ्यास न तो मान लेना है।

यदि आपके पास पथ बिल्डर उपयोगिताओं / कक्षाओं तक पहुंच है, तो उन का उपयोग करें, यदि आपके कोड को प्रारूप में स्वीकार करने और तदनुसार कार्य करने के लिए नहीं लिखा है।

उपयोगकर्ता के लिए कुछ भी अधिक कष्टप्रद नहीं है कि याद रखने के लिए कि एक अनुगामी स्लैश जोड़ना है या नहीं।


6
परिणाम: उपयुक्त आदेश-पंक्ति उपकरण के साथ हमेशा पार्स पथ - dirname, basenameऔर readlink। एक बहुत ही आम समस्या के ${path##*/}लिए एक प्रतिस्थापन के रूप में उपयोग किया जाता है basename, लेकिन अगर पथ एक स्लैश के साथ समाप्त होता है जो अंतिम पथ तत्व के बजाय एक खाली स्ट्रिंग लौटाता है।
l0b0

1
उपयोगिता वर्गों का उपयोग करने के लिए +1। मैं यह नहीं कह सकता कि मैंने कितनी बार डेवलपर्स को पहिया को फिर से आविष्कार करने के लिए देखा है जब यह कोडांतरण पथों की बात आती है, जब अधिकांश फ्रेमवर्क इसे आसानी से आजकल कर सकते हैं।
रेशनलगीक

1
इसके अलावा, जब कुछ एप्लिकेशन को विशिष्ट तरीके से ऐसा करने की आवश्यकता होती है, तो मुझे बहुत गुस्सा आता है। और कभी-कभी उपयोगकर्ता उस पथ को लिखने के तरीके को नियंत्रित नहीं कर सकते हैं: कभी-कभी वे इसे लिखते हैं, इसलिए हां, वे स्लैश के साथ या उसके बिना लिखना चुनते हैं, लेकिन उन मामलों में जहां उपयोगकर्ता टैब का उपयोग करते हुए ऑटोकंप्लीट करते हैं, कई गोले अनुगामी स्लैश डालते हैं। इसलिए आपको इसे हटाने के लिए उपयोगकर्ता की आवश्यकता होगी? और भी अधिक कष्टप्रद है जब कोई एप्लिकेशन अलग तरह से व्यवहार करता है यदि आप अनुगामी स्लैश को एक तर्क के रूप में पारित कर देते हैं ( rsyncमैं आपको देख रहा हूं)
कार्लोस कैंपडरो

मुझे हाल ही में rsync के साथ उपयोग के लिए उपयोगकर्ता इनपुट से एक अनुगामी स्लैश को सत्यापित करने की आवश्यकता है (क्योंकि यह इन चीजों के प्रति संवेदनशील है)। जैसा कि @ChrisF ने उल्लेख किया है, यह न तो मानने के लिए सबसे अच्छा अभ्यास है। मैं न तो संभालने का एक सुंदर तरीका के रूप में निम्नलिखित के साथ आया था: ${STR}$(printf \\$(printf '%03o' $(($(printf '%d' "'${STR:(-1)}")==47?0:47))))मैंने इसे स्पष्टता के लिए एक जिस्म में भी प्रलेखित किया था: बैश में अनुगामी स्लेश जोड़ें या निकालें
जॉन मार्क मिशेल

10

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

cat /etc/hosts

जैसा है वैसा ही है

cat /////etc//////////hosts

तो आपकी स्क्रिप्ट इस तरह दिख सकती है:

echo -n "enter path: "
read path
if [ -f $path/myfile ]
then
  echo "found myfile!"
else
  echo "nope"
fi

और आपको यह चिंता करने की आवश्यकता नहीं है कि उपयोगकर्ता पथ में एक अनुगामी / प्रवेश करता है या नहीं।


5
Nit: यह bashव्यवहार नहीं है, कर्नेल करता है।
ब्लफ़ल

7

स्वर्गीय जॉन पोस्टेल ने RFC 760 की धारा 3.2 में कुछ बढ़िया सलाह दी जो यहाँ लागू होती है:

सामान्य तौर पर, एक कार्यान्वयन को उसके भेजने वाले व्यवहार में रूढ़िवादी होना चाहिए, और उसके प्राप्त व्यवहार में उदार होना चाहिए। यही है, यह अच्छी तरह से गठित डेटाग्राम भेजने के लिए सावधान रहना चाहिए, लेकिन किसी भी डेटाग्राम को स्वीकार करना चाहिए कि यह व्याख्या कर सकता है (उदाहरण के लिए, तकनीकी त्रुटियों पर ऑब्जेक्ट नहीं है जहां अर्थ अभी भी स्पष्ट है)।


3

वैचारिक रूप से, स्लैश नाम का हिस्सा नहीं है। स्लैश केवल नामों के बीच एक सीमांकक है। मेरा घर- dir / home / stefan है और / home / stefan / नहीं है।

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

a="/home"
b="stefan"

dir=$a/$b

0

यह अनुरोध करते हुए कि निर्देशिका में अनुगामी स्लैश नहीं होना चाहिए कंसोल पर इंटरएक्टिव उपयोग के लिए बेहद कष्टप्रद होगा: TAB के साथ स्वत: पूर्णता स्वचालित रूप से निर्देशिकाओं के लिए अनुगामी स्लैश जोड़ता है।

तो आपको निश्चित रूप से अनुमति देने की आवश्यकता है कि निर्देशिकाओं को स्लैशिंग स्लैश के साथ निर्दिष्ट किया गया है।

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