यूनिक्स निष्पादन योग्य फ़ाइलों की खोज कैसे करता है?


47

जब किसी फ़ाइल को निष्पादित किया जाता है, तो यूनिक्स कैसे खोजता है? यदि PATH में एक ही नाम के साथ कई निष्पादन योग्य फाइलें हैं, तो कौन सी पसंद की जाती है? क्या किसी फ़ाइल को निष्पादित करते समय वर्तमान निर्देशिका खोज में शामिल है?

मान लीजिए executable.shकि वर्तमान निर्देशिका में नाम के साथ एक फ़ाइल है । यदि यह निष्पादित होता है $ executedऔर यह काम नहीं करता है तो क्या यह काम .करेगा PATH?


उल्लेख which <executable>सूत्र इस धागे में उपयोगी होगा।
लेखाकार

जवाबों:


45

$ PATH की शुरुआत से अंत तक खोज की जाती है, जिसमें पहले मिलान निष्पादन योग्य चलाया जाता है। इसलिए $ PATH की शुरुआत में निर्देशिका बाद में आने वालों पर वरीयता लेती हैं। वर्तमान निर्देशिका () में निष्पादन योग्य केवल तभी निष्पादित किए जाते हैं यदि। $ PATH में है (जो आमतौर पर ऐसा नहीं है )। खोज पथ में वर्तमान निर्देशिका का कोई अंतर्निहित समावेश नहीं है।


यह अजीब बात है कि, मेरे $ PATH में यह शामिल नहीं है ., लेकिन ऐसा लगता है कि यह वर्तमान dir से खोजेगा, इससे पहले $ PATH में परिभाषित चेक dirs।
एरिक वांग

19

वर्तमान निर्देशिका में फ़ाइलों के लिए, आप उन्हें पूर्ववर्ती बनाना ./चाहेंगे, ताकि कमांड बन जाए ./executable.sh। आपको .अपने PATH में कभी नहीं होना चाहिए क्योंकि यह अन्य समस्याओं के साथ सुरक्षा जोखिम पैदा करता है।

PATH में पहले आने वाले और पहले खोजे जाने वाले निर्देशिकाएँ।

अगर मैं सही ढंग से याद करूं तो खोज करने का समग्र क्रम इस तरह है:

  • उपनाम

  • निर्यात किए गए कार्य

  • अंतर्निहित शेल कमांड

  • स्क्रिप्ट और बायनेरी आपके पेट में


7
मैं हैश जोड़ूंगा - बैश (और शायद अन्य गोले) याद रखें, हाल ही में उपयोग किए गए आदेशों का एक हैश रखें ताकि उन्हें आसानी से खोजा जा सके। कभी-कभी आपको hash -rअपने PATH या प्रोग्राम स्थानों को बदलने पर कैश (उपयोग ) को शुद्ध करना पड़ता है ।
अमीर होमोलका

3
खोज के क्रम के लिए +1। अच्छा होगा यदि आप सूचना के स्रोत को याद रख सकते हैं :)
twan163

8

हालांकि इसका उत्तर कुछ अन्य लोगों द्वारा दिया गया है, मैं कुछ विचार जोड़ना चाहूंगा:

1) PATH से केवल तभी सलाह ली जाती है जब निष्पादन योग्य आह्वान में कोई पथ तत्व न हो। somecommand $ PATH में देखा जाएगा, ./somecommandया /usr/bin/somecommand, ../../bin/somecommandकेवल निर्देशिका नियमों का उपयोग करें, PATH नहीं

यदि PATH में एक ही नाम के साथ कई निष्पादन योग्य फाइलें हैं, जिसे एक पसंद किया जाता है?

यह पहले पायदान पर रुकता है, $ PATH को दाएं से बाएं पढ़ना।

क्या फ़ाइल को निष्पादित करते समय वर्तमान निर्देशिका खोज में शामिल है?

यदि वर्तमान निर्देशिका PATH में है तो इसे खोजा जाता है। याद रखें कि PATH में एक खाली निर्देशिका में वर्तमान निर्देशिका शामिल है। जैसे PATH =: / usr / bin (अग्रणी खाली) PATH = / usr / bin: (अनुगामी खाली) और PATH = / usr / bin :: / bin (मध्य खाली) सभी प्रभावी रूप से वर्तमान कार्य निर्देशिका में शामिल होंगे।

मान लीजिए कि एक फ़ाइल है जिसका नाम निष्पादन योग्य है। वर्तमान निर्देशिका में। क्या यह काम करेगा यदि इसे $ निष्पादित किया जाए और। पथ का हिस्सा नहीं है?

इसे पाथ खोजकर कभी नहीं मिलेगा। यदि वर्तमान dir PATH में नहीं है, तो वह इसे PATH लुकअप द्वारा नहीं ढूंढेगा।

उस ने कहा (और भ्रम को जोड़ने के लिए क्षमा करें) यदि कोई उर्फ ​​या फ़ंक्शन था जो कमांड चलाता था, तो इसे चलाया जाएगा। या यदि आपके शेल में एक स्थान कैश है, और निष्पादन योग्य कैश में था, तो यह मिल सकता है। इसलिए, यह इसे पेट में कभी नहीं मिलेगा, लेकिन इसे अन्य तरीकों से चलाया जा सकता है।


cacheनोट के लिए धन्यवाद , यह लगभग मुझे पागल कर देता है कि पुराने निष्पादन योग्य /usr/bin/अभी भी नए में नहीं लगाए गए हैं /usr/local/bin, हालांकि यह $PATHतब तक बाईं तरफ है जब तक मैं लॉग आउट नहीं किया, और फिर से लॉग इन किया।
एकाउंटेंट एनएच

1
बैश में @theaccountant आप शेल कैश को साफ़ करने के लिए 'हैश -r' कर सकते हैं
रिच होमोलका

4

यह देखने के लिए कि वर्तमान में आपका रास्ता क्या है echo $PATH , या printenv PATH

तब आपको खोज का क्रम ज्ञात होगा। यदि आपके पास एक ही नाम वाली कई फाइलें हैं, तो देखें कि कौन सा ____ है।

पूर्व।

प्रणाली #> जो grep

/ Usr / bin / ग्रेप

अपने लक्ष्य की तरह काम करने वाली फ़ाइलों को खोजने के लिए एक अच्छा तरीका है एप्रोपोस का उपयोग करना:

एप्रोपोस ग्रीप

bzgrep (1) - एक नियमित अभिव्यक्ति के लिए संभवतः bzip2 संपीड़ित फ़ाइलों को खोजें

egrep (1) - पैटर्न से मेल खाती प्रिंट लाइनें

fgrep (1) - पैटर्न से मेल खाती प्रिंट लाइनें

grep (1) - पैटर्न से मेल खाती प्रिंट लाइनें

और इसी तरह...


2
अरे हाँ - मैं एक फ़ाइल के सभी उदाहरणों को खोजने के लिए व्हिसिस फंक्शन को भूल गया :> व्हेयरिस grep
mbb

grep: / bin / grep / usr / bin / grep /usr/share/man/man1/grep.1.gz
mbb

whereisस्थानों की हार्डकोड सूची का उपयोग करता है, नहीं $PATH
ग्रिटिटी

क्या आप उस पर विस्तार कर सकते हैं?
विनयुनुच्स

-2

@ coneslayer- निष्पादन योग्य खोजने का डिफ़ॉल्ट क्रम वर्तमान पथ है, जो कमांड में बनाया गया है और फिर $ PATH है। इसलिए यदि निष्पादन योग्य नाम का कोई कार्य पहले से ही pwd में मौजूद है, तो उसे निष्पादित किया जाता है। ऐसा नहीं है तो पूर्ववर्ती आदेश शेल के कमांड में बनाया गया है और फिर $ PATH


यदि आप थॉम्पसन शेल, माशे शेल, या 40 साल पहले के कुछ अन्य जीवाश्म धारण के बारे में बात कर रहे थे, तो आप सही हो सकते हैं। लेकिन कोई भी वर्तमान, मुख्यधारा यूनिक्स खोल वर्तमान निर्देशिका को स्वचालित रूप से नहीं खोजता है।
स्कॉट

@ साइन करें तो कमांड के लिए डिफ़ॉल्ट खोज पथ पहले बनाया गया है और फिर $ PATH और अगर मैं देता हूं तो CWD खोजता है। क्या मैं सही हू?
proc

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