बहुत से लोग ऑन्लाइनर और स्क्रिप्ट्स का उपयोग करते हैं, जिनमें लाइनें होती हैं
cat "$MYFILE" | command1 | command2 > "$OUTPUT"
पहले cat
को अक्सर "बिल्ली का बेकार उपयोग" कहा जाता है, क्योंकि तकनीकी रूप से इसे एक नई प्रक्रिया (अक्सर /usr/bin/cat
) शुरू करने की आवश्यकता होती है, जहां कमांड से होने पर इससे बचा जा सकता था।
< "$MYFILE" command1 | command2 > "$OUTPUT"
क्योंकि तब शेल को केवल शुरू करने की जरूरत है command1
और बस stdin
दिए गए फ़ाइल को इंगित करें ।
शेल यह रूपांतरण स्वचालित रूप से क्यों नहीं करता है? मुझे लगता है कि "बिल्ली का बेकार उपयोग" वाक्यविन्यास पढ़ना आसान है और शेल में स्वचालित रूप से बेकार बिल्ली से छुटकारा पाने के लिए पर्याप्त जानकारी होनी चाहिए। cat
POSIX मानक में परिभाषित किया गया है तो खोल रास्ते में एक द्विआधारी का उपयोग करने का आंतरिक रूप से बजाय इसे लागू करने की अनुमति दी जानी चाहिए। शेल में केवल एक तर्क संस्करण के लिए कार्यान्वयन शामिल हो सकता है और पथ में द्विआधारी में वापसी हो सकती है।
lseek
करना अभी भी परिभाषित व्यवहार है और एक अलग परिणाम का कारण बन सकता है, अलग-अलग अवरुद्ध व्यवहार शब्दार्थ रूप से सार्थक हो सकते हैं, आदि यह परिवर्तन करने के लिए स्वीकार्य होगा यदि आप जानते थे कि अन्य कमांड क्या थे और जानते थे कि वे परवाह नहीं करते थे, या यदि आप उस स्तर पर अनुकूलता की परवाह नहीं करते हैं, लेकिन लाभ बहुत छोटा है। मैं कल्पना करता हूं कि लाभ की कमी स्थिति को अनुरूपता लागत से अधिक चलाती है।
cat
खुद को लागू करने की अनुमति है, हालांकि, या किसी अन्य उपयोगिता। यह जानने की भी अनुमति है कि सिस्टम के काम के अन्य उपयोगिताओं का उपयोग कैसे किया जाता है (जैसे यह जान सकता है कि सिस्टम के साथ आया बाहरी grep
कार्यान्वयन कैसे व्यवहार करता है)। यह करने के लिए पूरी तरह से व्यवहार्य है, इसलिए यह आश्चर्य की पूरी तरह से उचित है कि वे क्यों नहीं करते हैं।
grep
। और sed
। और awk
। और du
। और कितने सैकड़ों यदि अन्य उपयोगिताओं के हजारों नहीं हैं?