इस साइट पर POSIX शेल मानक कहता है
http://pubs.opengroup.org/onlinepubs/9699919799/
PATH
निष्पादनयोग्य को देखने के लिए गोले का उपयोग कैसे किया जाता है:
"सूची को शुरू से अंत तक खोजा जाएगा, प्रत्येक नाम के लिए फ़ाइल नाम लागू करते हुए, जब तक कि निर्दिष्ट नाम और उचित निष्पादन अनुमतियों के साथ एक निष्पादन योग्य फ़ाइल नहीं मिलती है।"
खैर, ऐसा नहीं है कि यह वास्तविक POSIX कार्यान्वयन में कैसे काम करता है:
man which
कहते हैं:
"फ़ाइलों के लिंक (या लिंक) जो वर्तमान परिवेश में निष्पादित किए जाएंगे, के पास इसके तर्क दिए गए थे, इसके तर्क एक कड़ाई से POSIX-अनुरूप शेल में कमांड के रूप में दिए गए थे। यह ऐसा करता है कि निष्पादन योग्य फ़ाइलों के लिए PATH को खोजकर उसके नाम से मेल खाता है। तर्क। यह प्रतीकात्मक लिंक का पालन नहीं करता है। "
ठीक है, आइए इस स्थिति को देखें:
$ pwd
/home/mark
$ echo $PATH
/home/mark/bin:
...
$ ls -l bin/foobar
lrwxrwxrwx 1 mark mark 18 Dec 12 22:51 bin/foobar -> /home/mark/foobar1
$ touch foobar1
$ which foobar
$ chmod a+x foobar1
$ which foobar
/home/mark/bin/foobar
ठीक है, यहां PATH
सही नाम के साथ एक प्रतीकात्मक लिंक है , और इसे ls
निष्पादन योग्य होने की सूचना दी गई है।
which
यह बिल्कुल नहीं दिखता है, लेकिन केवल इस बात में दिलचस्पी है कि यह किस ओर इशारा करता है।
इस तथ्य के बावजूद कि दोनों man which
स्पष्ट रूप से कहते हैं कि यह प्रतीकात्मक लिंक का पालन नहीं करता है (और वास्तव में हम इसे नहीं देखते हैं, क्योंकि which foobar
यह प्रिंट नहीं करता है foobar1
), और यह भी कि ऊपर उद्धृत पोज़िक शेल प्रलेखन, कभी भी PATH
एल्गोरिथम में सिमिलिंक का पालन करने का उल्लेख नहीं करता है।
तो, क्या which
और मौजूदा गोले गलत हैं, या मैं प्रलेखन को नहीं समझ रहा हूं?
स्पष्ट करने के लिए:
मैं जानता हूं और मौजूदा व्यवहार की व्याख्या कर सकता हूं। मेरा सवाल "यह कैसे काम करता है?" नहीं है। वह हम जानते है।
मेरा प्रश्न दस्तावेज़ीकरण के बारे में है: जहाँ मैंने उद्धृत किए गए दस्तावेज़ का पालन करने में मेरी गलती कहाँ है। या डॉक्यूमेंटेशन गलत है?
प्रेरणा: मुझे परवाह क्यों है?
खैर, मैं एक कार्यान्वयनकर्ता हूं। विभिन्न कार्यान्वयनकर्ताओं की अलग-अलग आवश्यकताएं होती हैं। मेरे लिए, आवश्यकता इस बात की है कि वर्तमान POSIX मानक MUST के शब्द का अनुसरण किया जाना चाहिए (या, अधिक सटीक रूप से, सबसे अच्छा यह हो सकता है, क्योंकि, मानक स्वयं कुछ छोटी गाड़ी है)। जैसे यह भगवान का शब्द था।
अब, मानक शब्दांकन बहुत स्पष्ट है - निम्नलिखित सिम्बलिंक का उल्लेख नहीं किया गया है, जहां कई अन्य स्थानों पर, यह उल्लेख किया गया है कि इसे कहाँ किया जाना चाहिए। तो इस मामले में, नहीं।
हालाँकि, मैं हमेशा जाँच करता हूँ कि कैसे dash
और कैसे bash
व्यवहार करें, बस सुनिश्चित करने के लिए। अब निश्चित रूप से, यहाँ थोड़ी समस्या है, dash
भले ही इसे POSIX के रूप में बिल किया गया हो, POSIX के अनुरूप बहुत से छोटे कीड़े हैं। bash
, मुझे अभी तक POSIX के साथ किसी भी कीड़े को ढूंढना है, लेकिन ... bash वास्तव में POSIX नहीं है, यह उससे कहीं अधिक है।
इसलिए यह अब आपके पास है। यही कारण है कि मुझे परवाह है।
$PATH
में कोई सहानुभूति नहीं है।
lstat(2)
), उनका अनुसरण करना आमतौर पर नहीं कहा जाता है। उदाहरण के लिए, open(2)
केवल व्यवहार के बारे में बात करते समय सहानुभूति का वर्णन है O_CREAT | O_EXCL
। यह बताने की आवश्यकता नहीं है कि लक्ष्य फ़ाइल खोली जाएगी।
$PATH
सहानुभूति हो सकती है। कोशिश करोwhich sh
।