मैं शेल स्क्रिप्ट के POSIX अनुपालन के लिए कैसे परीक्षण कर सकता हूं?


72

यह देखते हुए कि सभी यूनियनों के बीच POSIX एक सामान्य मानक के सबसे करीब है, मुझे यह जानने में दिलचस्पी है कि क्या कोई ऐसा शेल है जो इसे विशेष रूप से समर्थन करता है। हालांकि अधिकांश आधुनिक गोले POSIX के लिए समर्थन प्रदान करते हैं (और बिना किसी समस्या के POSIX अनुरूप स्क्रिप्ट चलाएंगे), वे गैर अनुरूप सुविधाओं को इंगित करने में अच्छा काम नहीं करते हैं।

क्या कोई ऐसा शेल है जो केवल POSIX और POSIX को लागू करता है, इस तरह से कि यह किसी भी गैर अनुपालन सुविधा के लिए एक त्रुटि फेंक सकता है?

EDIT मैं स्पष्ट करना चाहता हूं कि मैं पोर्टेबल शेल स्क्रिप्ट लिखने के लिए सामान्य सुझाव नहीं मांग रहा हूं। संबंधित प्रश्नों का उल्लेख टिप्पणियों में किया गया है। मैंने इस सवाल के बारे में सोचा जब मुझे पता चला कि bashइसका एक --posixविकल्प है लेकिन केवल यह पता लगाने के लिए कि यह केवल कुछ गहन व्यवहार को प्रभावित करता है जो कि वास्तव में मैं नहीं देख रहा हूं।



@ गिल्स: शायद मुझे यह उल्लेख करना चाहिए कि मैं इस सवाल पर आया था लेकिन केवल एक उत्तर के साथ परीक्षण करने का सुझाव दिया dash। मैंने अपने प्रश्न के लिए एक सामान्य संदर्भ के रूप में पोर्टेबिलिटी का उल्लेख किया था लेकिन यह इसका असली इरादा नहीं था।
रहमू

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

2
बिजीबॉक्स केवल POSIX और POSIX के बहुत करीब है। एक चीज जो आपको यात्रा कर सकती है, वह यह है कि यदि आप अन्य पैकेज (डिफ्यूटल की तरह) भी स्थापित करते हैं तो इसमें फीचर्स जुड़ सकते हैं। चेकआउट अल्पाइन लिनेक्स का लाइव एलसीडी जो आपको एक शुद्ध व्यस्त वातावरण के साथ शुरू करता है। अल्पाइन musl C लाइब्रेरी का उपयोग करता है, इसलिए आपको GNU एक्सटेंशन नहीं मिलते हैं जो विस्तारित नियमित अभिव्यक्तियों जैसी सुविधाएँ जोड़ सकते हैं।
माइकल फॉक्स

जवाबों:


37

दुर्भाग्य से, 'पोर्टेबल' आमतौर पर शेल स्क्रिप्ट के लिए 'POSIX-compliant' की तुलना में अधिक मजबूत आवश्यकता है। यानी, ऐसा कुछ लिखना जो किसी भी POSIX शेल पर चलता है, बहुत कठिन नहीं है, लेकिन इसे किसी भी वास्तविक दुनिया के शेल पर चलाना कठिन है।

आप अपने पैकेज मैनेजर में हर शेल स्थापित करके शुरू कर सकते हैं, विशेष रूप से डेबियन की poshआवाज़ों में जैसे कि आप क्या चाहते हैं (नीति-अनुपालन साधारण चिकित्सा पद्धति)। डेबियन की नीति कुछ अपवादों ( echo -nनिर्दिष्ट, local...) के साथ POSIX है ।

उस से परे, हालांकि, परीक्षण को कई प्लेटफार्मों पर (विशेष रूप से बिन / श) कवर करना पड़ता है। मैं सोलारिस (/ बिन / श और xpg4 / श), और बीएसडी पर परीक्षण करता हूं। AIX और HP-UX बहुत आज्ञाकारी हैं और समस्याओं का कारण नहीं हैं। bash अपनी थोड़ी सी दुनिया है।

मैं पोर्टेबल शेल के लिए ऑटोकॉन्फ़ गाइड की सिफारिश करूंगा , जो बिल्कुल शानदार है और बहुत समय बचाता है। इसके बड़े हिस्से अप्रचलित हैं, लेकिन यह ठीक है; बस TruUix और Ultrix को छोड़ दें और अगर आपको परवाह नहीं है!


poshवास्तव में मैं क्या पूछ रहा हूँ की तरह लगता है। मैं जितनी जल्दी हो सके कुछ परीक्षण करूँगा।
रहमू

1
मैंने संबंधित सवाल का जवाब देने से पहले जवाब दिया! पॉश एक डेबियन चीज़ है, इसलिए हर सिस्टम पर पैक नहीं किया जाएगा। इसके अलावा, शेल के बारे में सबसे अधिक चिंतित होना जरूरी नहीं है; उदाहरण के लिए sed असंगतता एक बड़ी समस्या है।
निकोलस विल्सन

मैं सोलारिस / बिन / श उर्फ ​​बॉर्न शेल (जो POSIX नहीं है) में पोर्टिंग को परेशान नहीं करूंगा। सभी आधुनिक यूनियनों की तरह सोलारिस में एक पॉसिंक शेल होता है, यह सिर्फ सामान्य स्थान (/ usr / xpg4 / bin / sh) में नहीं होता है
स्टीफन चेज़लस

अफसोस की बात है कि हम ऐसी स्क्रिप्ट्स को शिप करते हैं जिन्हें कम से कम हर / बिन / श पर चलाना होता है। यह सब इतना बुरा नहीं है ... मैं इसे हालांकि नहीं करना चाहता।
निकोलस विल्सन

2
मैं इसके कारण / बिन / श को महत्वपूर्ण मानता हूं क्योंकि यह कई लिपियों में शेबंग से लिया गया है। "" usr / bin / env sh "शायद ही कोई सुधार हो। यदि आप गैर-पॉसिक्स गोले पर कुछ काम करने में कोई प्रयास करने जा रहे हैं, तो मुझे लगता है कि मैं प्रत्येक सिस्टम / बिन / श को प्राथमिकता दे सकता हूं। यह कुछ समय पहले नहीं होगा जब कोई ग्राहक आपकी स्क्रिप्ट को डिफ़ॉल्ट शेल के साथ चलाता है, जो कि अनुचित नहीं है।
निकोलस विल्सन

28

आप ShellCheck (GitHub) को अपने शेल स्क्रिप्ट के लिंटर के रूप में उपयोग कर सकते हैं । एक ऑनलाइन संस्करण भी है ।

POSIX संगतता मुद्दों (जैसे SC2039 ) का पता लगाने के लिए , आपके शेल स्क्रिप्ट की शेलंग लाइन होनी चाहिए #!/bin/sh। तुम भी पारित कर सकते हैं --shell=shकरने के लिए shellcheck

उदाहरण ( test.sh):

#!/bin/sh
if [[ $HOSTNAME == test ]]; then
    echo fail &> foo
fi

परिणाम ( shellcheck test.sh):

In test.sh line 2:
if [[ $HOSTNAME == test ]]; then
   ^-- SC2039: In POSIX sh, [[ ]] is undefined.
      ^-- SC2039: In POSIX sh, HOSTNAME is undefined.    

In test.sh line 3:
    echo fail &> foo
              ^-- SC2039: In POSIX sh, &> is undefined.

1
इन सभी वर्षों और मैंने शेलचेक के बारे में कभी नहीं सुना ... लिंक के लिए धन्यवाद!
टन वैन डेन हेउवेल

सबसे अच्छा उपकरण कभी! विशेष रूप से इसका एक ऑनलाइन संस्करण होने से कोड का एक टुकड़ा जल्दी से जांचना भयानक है!
मखी

12

यदि POSIXLY_CORRECTवातावरण चर सेट किया जाता है तो बैश POSIX- अनुरूप मोड में चलेगा । मैनपेज से:

   POSIXLY_CORRECT
          If  this  variable  is  in the environment when bash starts, the
          shell enters posix mode before reading the startup files, as  if
          the  --posix  invocation option had been supplied.  If it is set
          while the shell is running, bash enables posix mode, as  if  the
          command set -o posix had been executed.

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


21
POSIX मोड में भी, bash अभी भी कुछ गैर-POSIX फीचर जैसे की अनुमति देगा [[
जोर्डनम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.