मुझे शेल स्क्रिप्ट में पथ चर के अंत में स्लैश का उपयोग करना चाहिए या नहीं? [बन्द है]


11

आज जब अपनी शेल स्क्रिप्ट लिख रहा हूं।

एक प्रश्न अचानक मेरे दिमाग में आता है।

चूंकि cd /target_dirऔर cd /target_dir/दोनों काम करते हैं।
क्या मुझे शेल स्क्रिप्ट में अपने पथ चर के अंत में एक स्लैश जोड़ना चाहिए?
जैसे LOG_PATH=/data/nginx/logsबनाम LOG_PATH=/data/nginx/logs/

मैंने Google पर कुछ सकल खोज की, लेकिन इस बारे में चर्चा नहीं की, शायद यह बहुत बुनियादी है?

अभी के लिए, मेरे लिए यह तय करना वास्तव में कठिन है कि किस शैली को चुनना है।
लेकिन मैंने LOG_PATH=/target_dir/स्टाइल को थोड़ा ज्यादा पसंद किया ।
क्योंकि जब मैं बैश के साथ स्वत: पूर्णता कर रहा हूं, तो यह मुझे स्लैश के साथ परिणाम देता है।

इस बारे में आपकी क्या राय है, क्यों?



कोई नियम नहीं है। दोनों कोडिंग शैली के कुछ फायदे और कुछ कमियां हैं।
andcoz

जवाबों:


9

POSIX के अनुसार:

एक पाथनाम की परिभाषा:

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


@ यह दिलचस्प है, कि मैं bd प्रॉम्प्ट पर उनके नाम के साथ //और /उनके नाम को अलग- pwdअलग तरीके से दिखा सकता हूं , और उनके उपयोग से मुझे अलग-अलग मार्ग दिखाए जाएंगे, लेकिन उनकी सामग्री समान है! क्यों?
ज़ेन


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


6

सुरक्षित पक्ष पर होने के लिए, स्लैश को शामिल करें। यह पथ को समतल करते समय कई स्लैश पैदा कर सकता है, लेकिन कम से कम आप समस्याओं से बचते हैं।

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

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


2

नहीं तुम्हे नहीं करना चाहिए। यह एक अतिरिक्त अनावश्यक स्लैश ( /) जोड़ता है ।

उदाहरण

आप binअपने PATHचर में जावा की निर्देशिका निर्यात करना चाहते हैं ,

export PATH=$PATH:/opt/jre1.7.0_45/bin/

अब इसे जांचें,

user@host:~$ which java
/opt/jre1.7.0_45/bin//java

/जावा से पहले अतिरिक्त स्लैश ( ) पर ध्यान दें , लेकिन सौभाग्य से यह ऐसे मामले में काम करता है।


मैंने इस लिंक में देखा कि 31 मतों का उत्तर है जिसमें लेखक को लगता है कि हमें एक स्लैश जोड़ना चाहिए। मैं उलझन में हूं। stackoverflow.com/questions/980255/…
ज़ेन

@, हाँ, मैंने इसे जाँच लिया, यह आपके प्रश्न की पहली टिप्पणी पर था। धन्यवाद।
अर्नब

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