मुझे संदेह है कि यूनिक्स (और परिणामस्वरूप लिनक्स) को आकार देने वाले विज़न / डिज़ाइन के साथ बहुत कुछ क्यों है, और इससे होने वाले फायदे।
इसमें कोई संदेह नहीं है कि एक अतिरिक्त प्रक्रिया को कताई नहीं करने के लिए एक गैर-नगण्य प्रदर्शन लाभ है, लेकिन मुझे लगता है कि इसमें और भी बहुत कुछ है: प्रारंभिक यूनिक्स में एक "सब कुछ एक फ़ाइल है" रूपक है, जिसका यदि आप देखते हैं तो एक गैर-स्पष्ट लेकिन सुरुचिपूर्ण लाभ होता है। यह एक शेल स्क्रिप्टिंग परिप्रेक्ष्य के बजाय एक सिस्टम परिप्रेक्ष्य से है।
मान लें कि आपके पास अपना null
कमांड-लाइन प्रोग्राम और /dev/null
डिवाइस नोड है। शेल-स्क्रिप्टिंग के दृष्टिकोण से, यह foo | null
कार्यक्रम वास्तव में उपयोगी और सुविधाजनक है , और foo >/dev/null
टाइप करने के लिए थोड़ा अधिक समय लेता है और अजीब लग सकता है।
लेकिन यहाँ दो अभ्यास हैं:
चलो null
मौजूदा यूनिक्स टूल और /dev/null
- आसान: का उपयोग करके कार्यक्रम को लागू करें cat >/dev/null
। किया हुआ।
आप के /dev/null
संदर्भ में लागू कर सकते हैं null
?
आप पूरी तरह से सही हैं कि इनपुट को छोड़ने के लिए सी कोड तुच्छ है, इसलिए यह अभी तक स्पष्ट नहीं हो सकता है कि कार्य के लिए वर्चुअल फ़ाइल उपलब्ध होना उपयोगी क्यों है।
विचार करें: लगभग हर प्रोग्रामिंग भाषा को पहले से ही फाइलों, फ़ाइल डिस्क्रिप्टर और फ़ाइल रास्तों के साथ काम करने की आवश्यकता होती है, क्योंकि वे शुरुआत से यूनिक्स की "सब कुछ एक फाइल" प्रतिमान का हिस्सा थे।
यदि आपके पास ऐसे सभी प्रोग्राम हैं जो स्टैडआउट को लिखते हैं, तो ठीक है, प्रोग्राम को परवाह नहीं है यदि आप उन्हें एक वर्चुअल फ़ाइल में रीडायरेक्ट करते हैं जो सभी लिखता है, या प्रोग्राम में एक पाइप जो सभी लिखता है को निगल जाता है।
अब यदि आपके पास ऐसे प्रोग्राम हैं जो डेटा को पढ़ने या लिखने के लिए फ़ाइल पथ लेते हैं (जो कि अधिकांश प्रोग्राम करते हैं) - और आप उन प्रोग्रामों में "रिक्त इनपुट" या "इस आउटपुट को छोड़ दें" कार्यक्षमता को जोड़ना चाहते हैं - अच्छी तरह से, /dev/null
जो मुफ्त में आता है।
ध्यान दें कि इसका लालित्य यह है कि सभी शामिल कार्यक्रमों की कोड जटिलता को कम करता है - प्रत्येक सामान्य-लेकिन-विशेष usecase के लिए जो आपका सिस्टम एक वास्तविक "फ़ाइलनाम" के साथ "फ़ाइल" के रूप में प्रदान कर सकता है, आपका कोड कस्टम कमांड जोड़ने से बच सकता है -लाइन विकल्प और कस्टम कोड को संभालने के लिए पथ।
अच्छा सॉफ्टवेयर इंजीनियरिंग अक्सर किसी समस्या के कुछ तत्व को अमूर्त करने के लिए अच्छे या "प्राकृतिक" रूपकों को खोजने पर निर्भर करता है, जिनके बारे में सोचना आसान हो जाता है , लेकिन लचीला बना रहता है , ताकि आप मूल रूप से उच्च-स्तरीय समस्याओं को हल किए बिना ही हल कर सकें। लगातार निम्न-स्तरीय समस्याओं के समाधानों को लागू करने पर समय और मानसिक ऊर्जा खर्च करें।
"सब कुछ एक फ़ाइल है" संसाधनों तक पहुँचने के लिए ऐसा ही एक रूपक प्रतीत होता है: आप open
एक दिए गए पथ को एक पदानुक्रमित नामस्थान में कॉल करते हैं, ऑब्जेक्ट के लिए एक संदर्भ (फ़ाइल डिस्क्रिप्टर) प्राप्त कर रहे हैं, और आप फ़ाइल डिस्क्रिप्टर पर read
और write
आदि कर सकते हैं । आपके stdin / stdout / stderr भी फाइल डिस्क्रिप्टर हैं जो आपके लिए पहले से खोले गए हैं। आपके पाइप सिर्फ फाइलें और फाइल डिस्क्रिप्टर हैं, और फाइल पुनर्निर्देशन आपको इन सभी टुकड़ों को एक साथ गोंद करने देता है।
यूनिक्स उतने ही सफल हुए जितने हिस्से में इन अमूर्तियों के एक साथ काम करने के कारण हुआ, और /dev/null
उस पूरे हिस्से के रूप में सबसे अच्छी तरह से समझा जाता है।
PS यह "सब कुछ एक फ़ाइल है" के यूनिक्स संस्करण को देखने लायक है और इसके बाद के /dev/null
रूप में कई प्रणालियों में लागू किए गए रूपक के अधिक लचीले और शक्तिशाली सामान्यीकरण की दिशा में पहला कदम जैसे चीजें हैं ।
उदाहरण के लिए, यूनिक्स में विशेष फ़ाइल-जैसी ऑब्जेक्ट्स /dev/null
को कर्नेल में ही लागू किया जाना था, लेकिन यह पता चला है कि यह फ़ाइल / फ़ोल्डर फॉर्म में कार्यक्षमता को उजागर करने के लिए पर्याप्त उपयोगी है क्योंकि तब से कई सिस्टम बनाए गए हैं जो कार्यक्रमों के लिए एक रास्ता प्रदान करते हैं ऐसा करने के लिए।
सबसे पहले एक योजना 9 ऑपरेटिंग सिस्टम थी, जो उन्निक्स के कुछ लोगों द्वारा बनाई गई थी। बाद में, GNU हर्ड ने अपने "अनुवादकों" के साथ कुछ ऐसा ही किया। इस बीच, लिनक्स ने FUSE (जो अब तक अन्य मुख्यधारा प्रणालियों में फैल गया है) प्राप्त करना समाप्त कर दिया।
cat foo | bar
का अधिकांश हिस्सा भी बहुत खराब (पैमाने पर) क्यों हैbar <foo
।cat
एक तुच्छ कार्यक्रम है, लेकिन यहां तक कि एक तुच्छ कार्यक्रम लागत बनाता है (उनमें से कुछ FIFO शब्दार्थों के लिए विशिष्ट है - क्योंकि कार्यक्रमseek()
FIFOs के अंदर नहीं हो सकते हैं , उदाहरण के लिए, एक ऐसा कार्यक्रम जिसे कुशलतापूर्वक लागू करने की मांग की जा सकती है, वह बहुत अधिक महंगा संचालन कर सकता है। जब एक पाइप लाइन दी जाती है, जैसे एक वर्ण डिवाइस के साथ,/dev/null
यह उन कार्यों को नकली कर सकता है, या एक वास्तविक फ़ाइल के साथ यह उन्हें लागू कर सकता है, लेकिन एक फीफो किसी भी तरह के संदर्भ-जागरूक हैंडलिंग की अनुमति नहीं देता है)।