क्या POSIX किसी भी मानक उपयोगिताओं के लिए पथ की गारंटी देता है?


22

सी से, मानक उपयोगिता (जैसे, पीएस) और कोई अन्य चलाने का सबसे आसान तरीका क्या है?

क्या POSIX गारंटी देता है कि, उदाहरण के लिए, एक मानक psमें है /bin/psया मुझे PATH पर्यावरण वैरिएबल को रीसेट करना चाहिए जो मुझे मिलता है confstr(_CS_PATH, pathbuf, n);और फिर PATH-search के माध्यम से उपयोगिता को चलाता है?


मेरे सिर के पीछे है कि POSIX कहता है, कई आदेशों के बीच, उनमें से ed (1) (जो mksh के लिए महत्वपूर्ण है ), कि, यदि वे उपलब्ध हैं, तो वे भी नीचे उपलब्ध होने चाहिए/bin , अर्थात /bin/edउपयोगी होना चाहिए यदि एड स्थापित है। मैं इसे अभी नहीं ढूँढ सकता, लेकिन मुझे पता है कि एलएसबी इस पर निर्भर करता है, और मैंने राशनेल के रूप में इसका उपयोग करते हुए बग्रेपोर्ट्स का सफलतापूर्वक बचाव किया है, इसलिए यह कम से कम किसी बिंदु पर सही होना चाहिए। (या यह POSuX के अलावा कुछ था और मैं गलत समझती हूं, लेकिन बाकी सब सच है।)
mirabilos

जवाबों:


33

नहीं, यह मुख्य रूप से इस कारण से नहीं है कि सिस्टम को डिफ़ॉल्ट रूप से अनुरूप होने की आवश्यकता नहीं है , या केवल POSIX मानक (किसी अन्य मानक के अपवर्जन के लिए) का पालन करने के लिए ।

उदाहरण के लिए, सोलारिस (एक प्रमाणित आज्ञाकारी प्रणाली) ने अपनी उपयोगिताओं के लिए पिछड़ी अनुकूलता को चुना /bin, जिसमें बताया गया है कि क्यों लोग आर्कन तरीके से व्यवहार करते हैं, और अलग-अलग स्थानों में पॉसिक्स-अनुरूप उपयोगिताओं प्रदान करते हैं ( ... /usr/xpg4/bin, /usr/xpg6/binXPG के विभिन्न संस्करणों के लिए (अब विलय कर दिया गया है) POSIX में) मानक, जो वास्तव में सोलारिस में वैकल्पिक घटकों का हिस्सा हैं)।

यहां तक ​​कि अंदर shहोने की गारंटी भी नहीं है /bin। सोलारिस पर, /bin/shसोलारिस 10 तक बॉर्न शेल (इसलिए POSIX कंप्लेंट नहीं) हुआ करता था, जबकि अब सोलारिस 11 में ksh93 है (अभी भी पूरी तरह से पॉसिक्स कंप्लेंट नहीं है, लेकिन प्रैक्टिस में ऐसा है /usr/xpg4/bin/sh)।

C से, आप exec*p()POSIX वातावरण में (विशेष रूप से PATHपर्यावरण चर के संबंध में ) आप उपयोग कर सकते हैं और मान सकते हैं ।

आप PATHपर्यावरण चर भी सेट कर सकते हैं

#define _POSIX_C_SOURCE=200809L /* before any #include */
...
confstr(_CS_PATH, buf, sizeof(buf)); /* maybe append the original
                                      * PATH if need be */
setenv("PATH", buf, 1);
exec*p("ps"...);

या आप उस समय का निर्धारण कर सकते हैं जब आप पोसिक्स उपयोगिताओं के पथ का निर्माण करना चाहते हैं (इस बात को ध्यान में रखते हुए कि जीएनयू जैसे कुछ सिस्टमों पर, आपको POSIXLY_CORRECTअनुपालन सुनिश्चित करने के लिए एक चर सेट करने जैसे अधिक चरणों की आवश्यकता है )।

तुम भी चीजों की कोशिश कर सकते हैं:

execlp("sh", "sh", "-c", "PATH=`getconf PATH`${PATH+:$PATH};export PATH;"
                         "unset IFS;shift \"$1\";"
                         "exec ${1+\"$@\"}", "2", "1", "ps", "-A"...);

इस उम्मीद में कि वहाँ एक shहै $PATH, कि यह बॉर्न की तरह है, कि वहाँ भी एक है getconfऔर यह कि आप में रुचि रखते हैं POSIX के संस्करण के लिए एक है।


तो आप # के लिए क्या करते हैं !?
जोशुआ

13
@ जोशुआ: आप प्रार्थना करते हैं कि /usr/bin/envमौजूद है और ज्यादातर पोसिक्स-आज्ञाकारी है।
केविन

3
@ केविन या आप अपने पैलियो-यूनिक्स के quirks के साथ खुद को परिचित करते हैं और # समायोजित करते हैं! सही रास्ते का उपयोग करने के लिए लाइन।
कैस

3
@ केविन: नहीं /usr/bin/env, इससे भी कम पोर्टेबल (व्यवहार में) हैक है /bin/sh। प्रति POSIX, एक खोल स्क्रिप्ट लिखने के लिए पोर्टेबल तरीका है कोई साथ #!सब पर । यदि कोई फ़ाइल निष्पादन योग्य है, लेकिन ENOEXECवैध बाइनरी नहीं है, execvpतो इसे मानक शेल के माध्यम से निष्पादित करना है। :-) बेशक व्यवहार में यह एक बुरा विचार है और आपको बस इसका उपयोग करना चाहिए #!/bin/sh
आर .. 13

2
@GeoffNixon, वह हिस्सा जिसे आप संदर्भित कर रहे हैं, जब आप ऐसा नहीं करते हैं, तो आप _POSIX_C_SOURCE का उपयोग नहीं कर सकते हैं या नहीं करना चाहते हैं के लिए एक विकल्प है। यह $PATHसी के बजाय शेल से सेटिंग करता है
स्टीफन चेजेलस

3

असल में, मैं काफी हद तक हां में जवाब दूंगा । POSIX गारंटी देता है:

  1. वहाँ है कि है प्रत्येक निर्दिष्ट उपयोगिता के मानकों का अनुपालन करने संस्करण के लिए एक पूर्ण पथ एक,
  2. और, कि आपको इस पूर्ण मार्ग को खोजने में सक्षम होना चाहिए, और इस उपयोगिता को निष्पादित करने में सक्षम होना चाहिए।

हालांकि यह जरूरी नहीं है कि प्रत्येक उपयोगिता सभी प्रणालियों ( /bin/ps) में एक विशेष निर्देशिका में होगी , यह हमेशा एक निष्पादन योग्य फ़ाइल के रूप में सिस्टम डिफ़ॉल्ट पथ में सक्षम होने की गारंटी देता है

दरअसल, मानक में यह करने के लिए केवल मानक निर्धारित रास्ते के माध्यम से (सी में) है unistd.h, रों _CS_PATH, या खोल में 'का एक संयोजन के माध्यम से commandऔर getconfउपयोगिताओं, यानी, PATH="$(command -p getconf PATH)" command -v psहमेशा की अनूठी निरपेक्ष पथ लौटना चाहिए POSIX अनुरूप एक विशेष प्रणाली पर आपूर्ति की। यही है, जबकि यह कार्यान्वयन-परिभाषित है कि सिस्टम डिफ़ॉल्ट पथ चर में कौन से पथ शामिल किए गए हैं, इन उपयोगों को हमेशा उपलब्ध, अद्वितीय और अनुपालन में होना चाहिए , इसमें निर्दिष्ट पथ में से एक में।ps

देखें: < unistd.h >, कमांड


लेकिन श के लिए, चिकन और अंडे की समस्या है। यह PATH=$(command -p getconf PATH)केवल POSIX वातावरण में POSIX शेल से काम करेगा। POSIX यह निर्दिष्ट नहीं करता है कि आप उस वातावरण में कैसे आते हैं, बस यह कि यह प्रलेखित है। उदाहरण के लिए, सोलारिस पर, आपके पास एक है /usr/xpg4/bin/getconfऔर /usr/xpg6/bin/getconfजो _CS_PATHमानक के दो अलग-अलग संस्करणों के लिए अलग-अलग मान लौटाएगा और न /usr/xpg4/binही /usr/xpg6/binडिफ़ॉल्ट मान में है $PATH। एक /usr/bin/getconfIIRC है जो आपको XPG4 अनुरूपता प्रदान करता है।
स्टीफन चेज़लस

क्या यह सोलारिस 11+ (UNIX 03+ प्रमाणित) संस्करणों के लिए भी सही है? मैंने हमेशा `` एप्लिकेशन पढ़े हैं ... गेटकॉफ़ पैट द्वारा लौटाए गए पैट के पूछताछ से निर्धारित किया जाना चाहिए, यह सुनिश्चित करते हुए कि लौटाया गया पथनाम एक पूर्ण पथनाम है और शेल-इन नहीं है। उदाहरण के लिए, मानक श उपयोगिता का स्थान निर्धारित करने के लिए: कमांड -v sh कुछ कार्यान्वयन पर यह वापस आ सकता है: / usr / xpg4 / bin / sh `` इसका अर्थ यह है कि एक shडिफ़ॉल्ट शेल से POSIX अनुरूप की प्रविष्टि होनी चाहिए ।
ज्योफ निक्सन

1
POSIX में ऐसा कुछ भी नहीं है जो कहता है कि किसी दिए गए सिस्टम getconfके डिफ़ॉल्ट में एक कमांड होना चाहिए $PATH। उदाहरण के लिए, POSIX वातावरण प्राप्त करने में एक अनुकरण परत शुरू करना शामिल हो सकता है, जिसके बिना आप किसी भी यूनिक्स जैसी कमांड को बिल्कुल नहीं चलाएंगे (उदाहरण के लिए विंडोज़ सोचें)। एक बार जब आप एक आज्ञाकारी वातावरण में होते हैं , तो आपको आज्ञाकारी उपयोगिताओं के लिए getconf PATH एक $PATHमिलेगा, लेकिन अगर आप एक POSIX वातावरण में थे, तो शायद पहले से ही यह मामला था। ध्यान दें कि getconf psवापस आ सकता है ps। बीत रहा है psbuiltin अनुमति दी है।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.