क्या मुझे / dev / null को पुनर्निर्देशित करने के लिए एकल या दोहरे कोण कोष्ठक का उपयोग करना चाहिए?


18

यहां अधिकांश उत्तर [ 1 ] [ 2 ] [ 3 ] एकल कोण ब्रैकेट का उपयोग इस तरह से / dev / null में पुनर्निर्देशित करने के लिए करते हैं:

command > /dev/null

लेकिन / देव / अशक्त कार्यों के लिए भी अपील:

command >> /dev/null

अतिरिक्त चरित्र को छोड़कर, क्या ऐसा करने का कोई कारण नहीं है? क्या इन "अच्छे" में से कोई भी / देव / अशक्त के अंतर्निहित कार्यान्वयन के लिए है?

संपादित करें: खुला (2) मैनपेज का कहना है lseek संलग्न मोड में एक फाइल करने के लिए प्रत्येक लिखने से पहले कहा जाता है:

O_APPEND
फ़ाइल को एपेंड मोड में खोला गया है। प्रत्येक लिखने (2) से पहले, फ़ाइल ऑफसेट फ़ाइल के अंत में स्थित है, जैसे कि lseek (2) के साथ। फ़ाइल ऑफसेट का संशोधन और लेखन ऑपरेशन एक एकल परमाणु कदम के रूप में किया जाता है।

जो मुझे लगता है कि उपयोग करने के लिए एक छोटा प्रदर्शन जुर्माना हो सकता है >>। लेकिन दूसरी ओर ट्रंकटिंग / देव / अशक्त उस दस्तावेज के अनुसार अपरिभाषित ऑपरेशन की तरह लगता है:

O_TRUNC
यदि फ़ाइल पहले से मौजूद है और एक नियमित फ़ाइल है और एक्सेस मोड लिखने की अनुमति देता है (यानी, O_RDWR या O_WRONLY है) तो इसे लंबाई में छोटा कर दिया जाएगा। 0. यदि फ़ाइल FIFO या टर्मिनल डिवाइस फ़ाइल है, तो O_TRUNC ध्वज को अनदेखा कर दिया गया है। अन्यथा, O_TRUNC का प्रभाव अनिर्दिष्ट है।

और POSIX कल्पना कहती है कि >किसी मौजूदा फ़ाइल को छोटा कर दिया जाएगा , लेकिन O_TRUNC डिवाइस फ़ाइलों के लिए कार्यान्वयन-परिभाषित है और इस पर कोई शब्द नहीं है कि कैसे / dev / null को छोटा किया जाना चाहिए

तो, वास्तव में अनिर्दिष्ट है / truncating / देव / अशक्त? और क्या लेज़ेक कॉल का लेखन प्रदर्शन पर कोई प्रभाव पड़ता है?

जवाबों:


27

परिभाषा के अनुसार/dev/null , इसमें कुछ भी लिखा गया है , इसलिए इससे कोई फर्क नहीं पड़ता कि आप एपेंड मोड में लिखते हैं या नहीं, यह सब त्याग दिया गया है। चूंकि यह डेटा को स्टोर नहीं करता है, इसलिए वास्तव में इसे करने के लिए कुछ भी नहीं है।

तो अंत में, यह सिर्फ > /dev/nullएक >संकेत के साथ लिखने के लिए छोटा है ।

संपादित जोड़ के लिए के रूप में:

खुले (2) मैनपेज का कहना है कि प्रत्येक मोड में फ़ाइल लिखने से पहले lseek को अपेंड मोड में कहा जाता है।

यदि आप बारीकी से पढ़ते हैं, तो आप कहेंगे कि यह (जोर मेरा):

फ़ाइल ऑफ़सेट फ़ाइल के अंत में स्थित है, जैसे कि lseek (2) के साथ

मतलब, यह (कॉल करने की आवश्यकता नहीं है) वास्तव में lseekसिस्टम कॉल को कॉल करता है, और प्रभाव कड़ाई से एक ही नहीं है: lseek(fd, SEEK_END, 0); write(fd, buf, size);बिना कॉल करना O_APPENDएपेंड मोड में लिखने के समान नहीं है, क्योंकि अलग-अलग कॉल के साथ एक और प्रक्रिया को लिख सकते हैं सिस्टम कॉल के बीच में फ़ाइल, संलग्न डेटा को ट्रैश करना। एपेंड मोड में, यह नहीं होता है ( एनएफएस को छोड़कर , जो वास्तविक एपेंड मोड का समर्थन नहीं करता है )।

मानक का पाठlseek उस बिंदु पर उल्लेख नहीं करता है , केवल वही लिखता है जो फ़ाइल के अंत में जाएगा।

तो, क्या वास्तव में अनिर्दिष्ट है?

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

और क्या लेज़ेक कॉल का लेखन प्रदर्शन पर कोई प्रभाव पड़ता है?

झसे आज़माओ। यह किसी दिए गए सिस्टम पर सुनिश्चित करने का एकमात्र तरीका है। या स्रोत को पढ़ने के लिए यह देखें कि एपेंड मोड, कहीं भी, व्यवहार को बदलता है।


-3

यदि यह आपकी क्षमता है, तो command >&-इसके बजाय उपयोग करें । यह फ़ाइल डिस्क्रिप्टर को रीडायरेक्ट करने के बजाय बंद कर देता है, इसलिए कोई भी समय इसे लिखने में व्यर्थ नहीं जाता है।


3
3 से कम धाराओं को बंद न करें। यह यादृच्छिक फ़ाइल डिस्क्रिप्टर के साथ std * डिस्क्रिप्टर को उपनाम देता है; संभावित विनाशकारी परिणामों के साथ।
जोशुआ

7
यदि आप फ़ाइल डिस्क्रिप्टर को बंद करते हैं, तो प्रोग्राम को हर राइट कॉल पर त्रुटियाँ मिलेंगी, शायद कष्टप्रद त्रुटि संदेशों की ओर अग्रसर होगा और संभवतः प्रोग्राम अपने कार्य को पूरा करने से पहले समाप्त कर देगा।
ilkkachu
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.