2011-08-19 4 views
7

मैं एक सी अनुप्रयोग पर काम कर रहा हूं जिसे बाइनरी के लिए पूर्ण पथनाम खोजने के लिए $ PATH चलना है, और केवल स्वीकार्य निर्भरता glibc है (यानी कोई बाहरी प्रोग्राम नहीं है)। सामान्य स्थिति में, यह सिर्फ कोलन द्वारा विभाजित गेटेंव ("पथ") को जोड़ता है और प्रत्येक निर्देशिका को एक-एक करके जांचता है, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि मैं सभी संभव कोने के मामलों को कवर करता हूं। मुझे क्या मिलना चाहिए? विशेष रूप से, सापेक्ष पथ हैं, जिनसे शुरू होने वाले पथ $ HOME तक विस्तारित किए गए हैं, या पथ वाले हैं: char अनुमति है?

उत्तर

11

एक चीज जो मुझे एक बार हैरान करती है वह है कि PATH में खाली स्ट्रिंग का मतलब वर्तमान निर्देशिका है। अंत में या PATH की शुरुआत में दो निकटतम कोलन या एक कोलन का अर्थ है कि वर्तमान निर्देशिका शामिल है। उदाहरण के लिए यह man bash में प्रलेखित है।

यह POSIX specification में भी है।

तो

PATH=:/bin 
PATH=/bin: 
PATH=/bin::/usr/bin 

सभी मतलब वर्तमान निर्देशिका है PATH

+3

+1 'कौन सा' के लिए स्रोत कोड को जांचने के बाद, ऐसा लगता है कि यह एकमात्र कोने का मामला है। 'कौन सा पहला चेक करता है कि एक पूर्ण पथ दिया गया था और फ़ाइल निष्पादन योग्य है। फिर यह पथ के प्रत्येक घटक को प्रीपेड करेगा और फिर से जांच करेगा, मौजूदा निर्देशिका के साथ एक खाली पथ घटक को बदल देगा। –

+0

spec के बाद, 'कौन सा, और कुछ सामान्य मानक गोले के कार्यान्वयन को एक अच्छा अच्छा परिप्रेक्ष्य देना चाहिए। – Novelocrat

2

में मुझे यकीन है कि यह सामान्य रूप में लिनक्स के साथ एक समस्या है नहीं कर रहा हूँ, लेकिन सुनिश्चित करें कि आपके कोड काम करता है अगर PATH कुछ अजीब है (जैसे, यूटीएफ -8) फैंसी अक्षरों वाली निर्देशिकाओं से निपटने के लिए एन्कोडिंग। मुझे संदेह है कि यह फाइल सिस्टम एन्कोडिंग पर निर्भर हो सकता है।

मुझे कुछ रूसी लड़के की एक बग रिपोर्ट पर काम करना याद है, जिनके उपयोगकर्ता नाम में फैंसी अक्षरों थे (और इसलिए, उनके घर निर्देशिका का नाम जो PATH में दिखाई दिया था)।

+0

नहीं, एन्कोडिंग 'पथ' के लिए अप्रासंगिक है। यदि कोई प्रोग्राम इसे मानता है, तो यह छोटी है। –

+0

@ आर .: दिलचस्प; क्या आपके पास उस दावे का समर्थन करने के लिए कुछ विनिर्देश हैं? मेरी समझ यह है कि 'पथ' को पार्स करने के लिए, आपको इसे अक्षरों के अनुक्रम के रूप में व्यवहार करना होगा ('बाइट्स 'के अनुक्रम के बजाय), इसलिए आपको एन्कोडिंग से अवगत होना चाहिए। –

+1

एकमात्र चरित्र जो 'पथ' में विशेष है, ':' है, इसलिए आपके दावे की वैधता हो सकती है, केवल वैधता विंडोज-ओरिएंटेड सीजेके एन्कोडिंग के साथ होती है, लेकिन इन्हें आमतौर पर यूनिक्स पर अनुपयोगी माना जाता है। –

1

यह मामूली है लेकिन मैं इसे जोड़ दूंगा क्योंकि इसका पहले से ही उल्लेख नहीं किया गया है। $ पाथ में पूर्ण और सापेक्ष पथ दोनों शामिल हो सकते हैं। यदि आप प्रत्येक निर्देशिका में chdir (2) ing द्वारा पथ सूची को क्रॉल करते हैं, तो आपको मूल कार्य निर्देशिका (getcwd (3)) और chdir (2) को क्रॉल के प्रत्येक पुनरावृत्ति पर वापस ट्रैक करने की आवश्यकता है।

1

मौजूदा जवाब इसमें से अधिकांश को कवर किया है, लेकिन यह सवाल के कुछ हिस्सों कि अभी तक उत्तर नहीं था कवर के लायक है:

  1. $ और ~ $ पथ के मूल्य में विशेष नहीं हैं।
  2. यदि $ PATH बिल्कुल सेट नहीं है, तो execvp() डिफ़ॉल्ट मान का उपयोग करेगा।
संबंधित मुद्दे

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