मुझे लगा कि मैंने 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न ही फाइल की शुरुआत या अंत की आवश्यकता है: वे बफ़र्स पर काम करते हैं।