2011-06-13 8 views
201

जब पार्टी में स्क्रिप्ट चला, मैं शुरुआत में ./ लिखने के लिए है:निष्पादन योग्य या स्क्रिप्ट नाम से पहले इसे बैश में चलाने के लिए आपको // (dot-slash) की आवश्यकता क्यों है?

$ ./manage.py syncdb 

अगर मैं नहीं, मैं एक त्रुटि संदेश मिलता है:

$ manage.py syncdb 
-bash: manage.py: command not found 

इस का कारण क्या है? मैंने सोचा कि . वर्तमान फ़ोल्डर के लिए उपनाम है, और इसलिए इन दो कॉलों के बराबर होना चाहिए।

मैं भी समझ में नहीं आता, जब इस तरह के रूप में आवेदन, चल कारण है कि मैं ./ की जरूरत नहीं है:

user:/home/user$ cd /usr/bin 
user:/usr/bin$ git 

+1

इस मामले पर यह सबसे अच्छा दस्तावेज है कि मैं अब तक आया हूं: http://www.linfo.org/dot_slash.html – odigity

उत्तर

209
क्योंकि यूनिक्स पर

(जो ./ बिना चलाता है), आमतौर पर, वर्तमान निर्देशिका $PATH में नहीं है।

जब आप कमांड टाइप करते हैं तो खोल PATH चर द्वारा निर्दिष्ट निर्देशिकाओं की एक सूची को देखता है। वर्तमान निर्देशिका उस सूची में नहीं है।

उस सूची में वर्तमान निर्देशिका न होने का कारण सुरक्षा है।

मान लें कि आप रूट हैं और किसी अन्य उपयोगकर्ता की निर्देशिका में जाएं और ls के बजाय sl टाइप करें। यदि वर्तमान निर्देशिका PATH में है, तो शेल उस निर्देशिका में sl प्रोग्राम निष्पादित करने का प्रयास करेगा (क्योंकि कोई अन्य sl प्रोग्राम नहीं है)। वह sl प्रोग्राम दुर्भावनापूर्ण हो सकता है।

यह साथ काम करता है ./ क्योंकि POSIX specifies कि एक कमांड नाम है कि एक / शामिल एक फ़ाइल नाम के रूप में सीधे इस्तेमाल किया जाएगा, $PATH में एक खोज को दबा। आप सटीक प्रभाव के लिए पूर्ण पथ का उपयोग कर सकते थे, लेकिन ./ लिखने के लिए छोटा और आसान है।

संपादित sl हिस्सा सिर्फ एक उदाहरण था

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

+34

आपको कुछ भी गलत टाइप करने की आवश्यकता नहीं है। उपयोगकर्ता ने अभी एक दुर्भावनापूर्ण पैकेज डाउनलोड किया हो जिसमें उसमें 'ls' निष्पादन योग्य हो। – Juliano

+0

क्या इसका मतलब यह है कि '.' वर्तमान फ़ोल्डर के लिए केवल उपनाम नहीं है बल्कि वास्तव में पूरे पथ में 'विस्तार' करता है? यह नहीं पता था, धन्यवाद .. –

+9

यह कहने वालों के लिए सिर्फ एक नोट है कि यह यूनिक्स में है और विंडोज नहीं, यह पावरहेल में भी समान है - आपको – manojlds

27

आपकी स्क्रिप्ट, जब आपकी होम निर्देशिका में नहीं मिलेगा जब शेल $PATH पर्यावरण चर को आपकी स्क्रिप्ट ढूंढने के लिए देखेगा।

./ कहता है '$PATH में निर्दिष्ट सभी निर्देशिकाओं को देखने के बजाय मेरी स्क्रिप्ट के लिए वर्तमान निर्देशिका में देखें'।

1

जब स्क्रिप्ट पथ में नहीं है तो ऐसा करने की आवश्यकता होती है। अधिक जानकारी के लिए http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_01.html

+4

... एफवाईआई, irc.freenode.org पर #bash में, हम लगातार टीएलडीपी (विशेष रूप से उन्नत बैश गाइड) से सीखा है गलतफहमी को सही कर रहे हैं। ऐसे में, लोगों को निर्देशित करना है ... शायद आदर्श नहीं है। (हमारा पसंदीदा प्रारंभिक दस्तावेज http://mywiki.wooledge.org/BashGuide है) –

3

जब आप '।' शामिल करते हैं आप अनिवार्य रूप से निष्पादन योग्य बैश स्क्रिप्ट को "पूर्ण पथ" दे रहे हैं, इसलिए आपके खोल को आपके पैथ चर को जांचने की आवश्यकता नहीं है। के बिना '।' आपका खोल आपके पैथ वैरिएबल में दिखाई देगा (जिसे आप echo $PATH चलाकर देख सकते हैं यह देखने के लिए कि क्या आपके द्वारा टाइप किया गया आदेश आपके पैथ पर किसी भी फ़ोल्डर में रहता है या नहीं।अगर ऐसा नहीं होता है (जैसा कि manage.py के मामले में है) यह कहता है कि यह फ़ाइल नहीं ढूंढ सकता है। इसे आपके पीएटीएच पर वर्तमान निर्देशिका को शामिल करने के लिए बुरी आदत माना जाता है, जिसे उचित रूप से अच्छी तरह से समझाया गया है: http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.html

1

* विंडोज़ के विपरीत, निक्स पर, वर्तमान निर्देशिका आमतौर पर आपके $PATH चर में नहीं है। इसलिए आदेशों को निष्पादित करते समय वर्तमान निर्देशिका खोज नहीं की जाती है। अनुप्रयोगों को चलाने के लिए आपको ./ की आवश्यकता नहीं है क्योंकि ये एप्लिकेशन आपके $ PATH में हैं; सबसे अधिक संभावना है कि वे /bin या /usr/bin में हैं।

41

जब बैश कमांड लाइन का अर्थ देता है, तो यह पर्यावरण चर $PATH में वर्णित स्थानों में कमांड की तलाश करता है। इसे देखने के लिए टाइप करें:

echo $PATH 

आपके पास कोलों द्वारा अलग किए गए कुछ पथ होंगे। जैसा कि आप वर्तमान पथ . देखेंगे आमतौर पर $PATH में नहीं है। तो यदि वर्तमान निर्देशिका में है तो बैश आपके कमांड को नहीं ढूंढ सकता है। आप होने से इसे बदल सकते हैं:

PATH=$PATH:. 

इस लाइन $PATH में वर्तमान निर्देशिका ताकि आप क्या कर सकते हैं कहते हैं:

manage.py syncdb 

यह सिफारिश नहीं के रूप में यह सुरक्षा मुद्दा है, साथ ही आप कर सकते हैं अजीब व्यवहार, के रूप में . निर्देशिका पर भिन्न होता है आप कर रहे हैं में :)

से बचें:

PATH=.:$PATH 

आप "मुखौटा" के रूप में कर सकते हैं कुछ मानक कमान और सुरक्षा भंग :)

बस मेरे दो सेंट के लिए द्वार खोल।

-5

Current Directory और Working Directory के बीच अंतर है तो आप इसे google पर आसानी से पा सकते हैं। यही कारण है कि manage.py syncdb अपेक्षित के रूप में निष्पादित नहीं है।

वर्तमान निर्देशिका: यह वह निर्देशिका है जहां से आपका खोल या पैरेंट प्रक्रिया निष्पादित की जा रही है।

you are right "." is for current directory. 

यूनिक्स आधारित प्रणाली में यदि आप /data/myfile.out पर अपने फ़ाइल है तो आप जिसके द्वारा forward slash "/" इसलिए यदि "." अपने वर्तमान निर्देशिका है अलग होती है घटकों के नाम के माध्यम से अपनी फ़ाइल को traversing कर रहे हैं तो आपके द्वारा एक्सेस करने के लिए (में अमल चाहते हैं कि आपके केस) फ़ाइल जो आपकी वर्तमान निर्देशिका के अंदर है आपको ./myexecutableFile.o कहना होगा। अगर आपकी वर्तमान निर्देशिका के किसी अन्य फ़ोल्डर में आपकी निष्पादन योग्य फ़ाइल थी तो आप इस ./myFiles/myexecutableFile.o जैसे कुछ करेंगे। आशा है कि आपको वह समझ मिले जो मैं समझाने की कोशिश कर रहा हूं।

1

यह सवाल पहले से ही कुछ भयानक जवाब है, लेकिन मुझे लगता है कि जोड़ने के लिए, यदि आपका निष्पादन-योग्य पथ पर है चाहता था, और आप बहुत अलग आउटपुट मिलता है जब आप

./executable 
जिन्हें आप अगर आप पाने के लिए

चलाने चलाने

executable 

, तो समस्या हो सकती है आप अपने मशीन पर निष्पादन के दो विभिन्न संस्करणों है (मान लीजिए कि आप एक और अन्य नहीं के साथ त्रुटि संदेश में चलाते हैं): पथ पर एक है, और अन्य नहीं।

चलाकर इस चेक

जो निष्पादन

और

whereis executable 

यह मेरी समस्या हल कर ली ... मैं निष्पादन के तीन संस्करण हैं, जिनमें से केवल एक के लिए सही ढंग से संकलित किया गया था वातावरण।

संबंधित मुद्दे

 संबंधित मुद्दे