मुझे लगा कि मैंने UNIX में सब कुछ देखा है। इस सवाल ने मुझे मेरी तस्करी से दूर कर दिया। क्या शानदार सवाल है!
tail
अंतिम एक्स लाइनें दिखाता है। tail -f
वही करता है, लेकिन अनिवार्य रूप से एक अनंत लूप में: स्टार्ट-अप पर, फ़ाइल की अंतिम एक्स लाइनों को दिखाएं, फिर कुछ ओएस जादू (जैसे कि अशुद्धि करना) का उपयोग करके, मॉनिटर करें और नई लाइनें दिखाएं।
अपना काम tail
करने के लिए, फ़ाइल के अंत का पता लगाने में सक्षम होना चाहिए। यदि tail
फ़ाइल का अंत नहीं मिल रहा है, तो यह अंतिम एक्स लाइनें नहीं दिखा सकता है, क्योंकि "अंतिम" अपरिभाषित है। तो tail
इस मामले में क्या करता है? यह फ़ाइल के अंत का पता लगाने तक इंतजार करता है।
इस पर विचार करो:
$ chatter() { while :; do date; sleep 1; done; }
$ chatter | tail -f
यह कभी प्रगति नहीं करता है, क्योंकि फ़ाइल का कोई निश्चित अंत कभी नहीं होता है chatter
।
यदि आप tail
आपको फ़ाइल सिस्टम पाइप से अंतिम पंक्तियाँ देने के लिए कहते हैं तो आपको वही व्यवहार मिलता है । विचार करें:
$ mkfifo test.pipe
$ tail test.pipe
stdbuf
कथित समस्या के आसपास पाने के लिए एक अच्छा प्रयास था। हालांकि मुख्य तथ्य यह है कि I / O बफरिंग मूल कारण नहीं है: एक निश्चित एंड-ऑफ-फ़ाइल की कमी है। यदि आप tail.c स्रोत कोड की जांच करते हैं , तो आप देखेंगे कि file_lines
फ़ंक्शन टिप्पणी पढ़ता है:
END_POS EOF की फ़ाइल ऑफ़सेट (पिछले बाइट की ऑफ़सेट से बड़ी) है।
और यही जादू है। किसी भी कॉन्फ़िगरेशन में काम करने के लिए आपको पूंछ के लिए एक एंड-ऑफ-फ़ाइल की आवश्यकता होती है। head
उस प्रतिबंध नहीं है, यह सिर्फ फ़ाइल की शुरुआत की जरूरत है (जो यह नहीं हो सकता है, कोशिश head test.pipe
)। स्ट्रीम ओरिएंटेड टूल जैसे कि sed
और awk
न ही फाइल की शुरुआत या अंत की आवश्यकता है: वे बफ़र्स पर काम करते हैं।