मेरे पास एक POSIX- संगत इंस्टॉल स्क्रिप्ट है जो किसी सॉफ़्टवेयर रजिस्ट्री से पुनर्प्राप्त किए गए json blob से जानकारी प्राप्त करके कुछ सॉफ़्टवेयर का नवीनतम संस्करण निर्धारित करता है:
meta=$(wget -qO - https://registry.npmjs.org/after-dark/latest)
grep --version | grep "BSD grep" 1>/dev/null && vers=$(echo "$meta" | grep -oE '"version":(\d*?,|.*?[^\\]",)' | tr -d 'version": ,')
grep --version | grep "GNU grep" 1>/dev/null && vers=$(echo "$meta" | grep -oP '"version":(\d*?,|.*?[^\\]",)' | tr -d 'version": ,')
मुझे इस सॉफ़्टवेयर को बिजीबॉक्स के साथ संगत बनाने की आवश्यकता है, जो बीएसडी grep की तरह, -Eविस्तारित रेगेक्स समर्थन के लिए उपयोग करता है । हालाँकि, यह --versionध्वज का समर्थन नहीं करता है ।
यदि मैं चलाता busybox grepहूं तो मुझे व्यस्त बॉक्स का संस्करण दिखाई देता है। क्या मुझे संगतता जोड़ने के लिए बस इसका उपयोग करना चाहिए? वहाँ एक बेहतर तरीका है कि मैं निर्भरता स्थापित किए बिना कोड गंध को दूर करने के लिए ऐसा कर सकता हूं।
busyboxकी grep। यह विभिन्न प्लेटफार्मों के अनुरूप होगा। केवल एक चीज यह है कि busyboxसभी प्रणालियों पर डिफ़ॉल्ट रूप से स्थापित नहीं है। एक अन्य दृष्टिकोण awkपार्सिंग के लिए उपयोग करना है, यह डिफ़ॉल्ट रूप से सभी यूनिक्स आधारित प्रणालियों के साथ आता है, यहां तक कि प्लेटफार्मों को छीन लिया गया है, बस केवल संगत awk के आदेशों का उपयोग करें जो इसके सभी स्वादों (क्लासिक awk, nawk, gawk ...) में मौजूद हैं, यह अधिक पोर्टेबल होगा।
awkबेहतर पोर्टेबिलिटी के लिए उपयोग करने के आपके सुझाव पर ध्यान दिया जाएगा। ऐसा लगता है कि समस्या की जड़, हालांकि, या तो विस्तारित बग का उपयोग करते समय बीएसडी grep में एक बग या अनिर्दिष्ट सुविधा हो सकती है ।
grepबाइनरी के लिए सही सिंटैक्स का उपयोग कर सकते हैं : unix.stackexchange.com/questions/6345/… - भी करने के लिए पूर्ण पथ का उपयोग करने का प्रयास करें/bin/grep।