ओपी ने जिन कारणों से विकल्पों को अनुपयुक्त बताया है उनमें से कुछ का वास्तविकता में कोई आधार नहीं है। यहाँ, मैं दिखाता हूँ कि ओपी की रणनीति 4 के उपयोग से किस तरह के प्रभाव पड़ते हैं:
अधिकांश वितरणों पर, (विशिष्ट) या (OpenSUSE, शायद अन्य) grep
में स्थापित किया गया है , और डिफ़ॉल्ट में पहले या शामिल हैं । इसका मतलब है कि यदि आप के साथ बनाते हैं/bin
/usr/bin
PATH
/usr/local/bin
/bin
/usr/bin
/usr/local/bin/grep
#!/bin/sh
exec /bin/grep --color=auto "$@"
/bin/sh
आपके वितरण द्वारा प्रदान किया जाने वाला POSIX- संगत शेल कहां है, आमतौर पर बैश या डैश। अगर grep
अंदर है /usr/bin
, तो बनाइए
#!/bin/sh
exec /usr/bin/grep --color=auto "$@"
इस लिपि का ओवरहेड न्यूनतम है। exec
बयान का मतलब है कि स्क्रिप्ट दुभाषिया की जगह grep
बाइनरी; इसका मतलब यह है कि शेल grep
निष्पादित होने के दौरान मेमोरी में नहीं रहता है । इस प्रकार, एकमात्र ओवरहेड स्क्रिप्ट दुभाषिया का एक अतिरिक्त निष्पादन है, अर्थात दीवार घड़ी के समय में एक छोटा विलंबता। विलंबता मोटे तौर पर स्थिर है (भिन्न होता है केवल इस आधार पर grep
और sh
पृष्ठ कैश या नहीं में पहले से ही कर रहे हैं, और पर कितना मैं / हे बैंडविड्थ उपलब्ध है), और पर कब तक निर्भर नहीं करता है grep
कार्यान्वित या कितना डेटा यह संसाधित करता है।
तो, वह विलंबता कब तक है, यानी ओवरहेड को रैपर लिपि द्वारा जोड़ा गया है?
पता लगाने के लिए, उपरोक्त स्क्रिप्ट बनाएं, और चलाएं
time /bin/grep --version
time /usr/local/bin/grep --version
मेरी मशीन पर, पूर्व 0.005s वास्तविक समय (बड़ी संख्या में रनों के पार) लेता है, जबकि बाद वाला 0.006s वास्तविक समय लेता है। इस प्रकार, मेरी मशीन पर आवरण का उपयोग करने का ओवरहेड 0.001 (या उससे कम) प्रति आह्वान है।
यह नगण्य है।
मैं इस बारे में कुछ भी "गंदा" देखने में विफल रहता हूं, क्योंकि कई सामान्य अनुप्रयोग और उपयोगिताओं एक ही दृष्टिकोण का उपयोग करते हैं। आपकी मशीन पर इस तरह के की सूची देखने के /bin
और /usr/bin
, बस चलाने
file /bin/* /usr/bin/* | sed -ne 's/:.*shell script.*$//p'
मेरी मशीन पर, ऊपर उत्पादन भी शामिल है egrep
, fgrep
, zgrep
, which
, 7z
, chromium-browser
, ldd
, और xfig
, मैं अक्सर उपयोग करता है। जब तक आप रैपर स्क्रिप्ट्स पर भरोसा करने के लिए अपने पूरे वितरण को "गंदा" नहीं मानते हैं, तब तक आपके पास ऐसी रैपर स्क्रिप्ट्स को "गंदा" मानने का कोई कारण नहीं है।
समस्याओं के रूप में इस तरह के एक रैपर स्क्रिप्ट का कारण हो सकता है:
केवल मानव उन (के रूप में स्क्रिप्ट के खिलाफ) ग्रेप का संस्करण रंग समर्थन करता है, तो उत्पादन एक टर्मिनल के लिए है करने के लिए चूक है, तो आवरण स्क्रिप्ट नामित किया जा सकता है उपयोग कर रहे हैं colorgrep
या cgrep
या जो कुछ भी ओ पी फिट देखता है।
यह सभी संभव संगतता मुद्दों से बचा जाता है, क्योंकि व्यवहार grep
बिल्कुल नहीं बदलता है।
grep
आवरण स्क्रिप्ट के साथ विकल्प सक्षम करना , लेकिन इस तरह से जो किसी नई समस्या से बचा रहे:
हम आसानी से एक कस्टम का समर्थन करने के लिए रैपर स्क्रिप्ट को फिर से लिख सकते हैं, GREP_OPTS
भले ही GREP_OPTIONS
समर्थित नहीं थे (जैसा कि यह पहले से ही पदावनत है)। इस तरह से उपयोगकर्ता केवल export "GREP_OPTIONS=--color=auto"
अपनी प्रोफ़ाइल में जोड़ या समान कर सकते हैं। /usr/local/bin/grep
तब है
#!/bin/sh
exec /bin/grep $GREP_OPTIONS "$@"
ध्यान दें कि आसपास कोई उद्धरण नहीं हैं $GREP_OPTIONS
, ताकि उपयोगकर्ता एक से अधिक विकल्प निर्दिष्ट कर सकें।
मेरे सिस्टम पर, खाली के time /usr/local/bin/grep --version
साथ GREP_OPTIONS
, या के साथ निष्पादित , GREP_OPTIONS=--color=auto
रैपर स्क्रिप्ट के पिछले संस्करण के समान तेज़ है; यानी, आम तौर पर सादे की तुलना में एक मिलीसेकंड से अधिक समय लगता है grep
।
यह अंतिम संस्करण वह है जिसे मैं व्यक्तिगत रूप से उपयोग के लिए सुझाऊंगा।
सारांश में, ओपी की रणनीति 4:
grep
डेवलपर्स द्वारा अनुशंसित क्षेत्र है
लागू करने के लिए तुच्छ है (दो लाइनें)
नगण्य ओवरहेड है (एक मिलीसेकंड अतिरिक्त विलंबता प्रति आह्वान इस विशेष लैपटॉप पर; आसानी से प्रत्येक मशीन पर सत्यापित)
एक रैपर स्क्रिप्ट के रूप में लागू किया जा सकता है जो GREP_OPTS
समर्थन जोड़ता है (पदावनत / असमर्थित को बदलने के लिए GREP_OPTIONS
)
लागू किया जा सकता है (के रूप में colorgrep
/ cgrep
) स्क्रिप्ट या मौजूदा उपयोगकर्ताओं को बिल्कुल प्रभावित नहीं करता है
क्योंकि यह एक ऐसी तकनीक है जो पहले से ही लिनक्स वितरण में व्यापक रूप से उपयोग की जाती है, यह एक सामान्य तकनीक है और "गंदा" नहीं है।
यदि एक अलग आवरण ( colorgrep
/ cgrep
) के रूप में लागू किया जाता है , तो यह नई समस्याएं पैदा नहीं कर सकता क्योंकि यह grep
व्यवहार को प्रभावित नहीं करता है । यदि एक आवरण स्क्रिप्ट के रूप में लागू किया जाता है जो GREP_OPTS
समर्थन जोड़ता है , तो उपयोग GREP_OPTS=--color=auto
में बिल्कुल समान जोखिम (मौजूदा स्क्रिप्ट के साथ समस्याएँ) हैं जो कि डिफ़ॉल्ट रूप से जोड़ना --color=auto
होगा। इस प्रकार, यह टिप्पणी कि "यह हल करता है की तुलना में अधिक समस्याएं पैदा करता है" पूरी तरह से गलत है: कोई अतिरिक्त समस्याएं पैदा नहीं होती हैं।