कम फ़ाइल 1 file2 | बिल्ली - यह काम क्यों करता है?


21

जब मुझे लगता है कि less file1 file2मुझे "कम बफर दर्शक" में दिखाई गई दोनों फाइलें मिलती हैं, लेकिन less file1 file2 | catदोनों फाइलों की सामग्री को प्रिंटआउट में प्रिंट कर देता है। यदि यह "कम बफर दर्शक" दिखाना चाहिए या अगले कमांड के लिए स्टडआउट करने के लिए आउटपुट का उत्पादन करना चाहिए, तो यह कैसे पता चलेगा? इसे करने के लिए किस तंत्र का उपयोग किया जाता है?

जवाबों:


30

lessपाठ को प्रिंट करने के लिए प्रिंट करता है। stdout जाता है

  • एक टर्मिनल (/ dev / tty?) और डिफ़ॉल्ट बफर दर्शक खोलता है
  • पाइप के माध्यम से जब इसे दूसरे प्रोग्राम में पाइपिंग का उपयोग किया जाता है | ( less text | cut -d: -f1)
  • एक करने के लिए फ़ाइल जब साथ यह पुनः निर्देशित> ( less text > tmp)

एक सी फ़ंक्शन है जिसे "इसा ट्टी " कहा जाता है, जो यह जांचता है कि आउटपुट टटी (कम 4.81, मुख्य। सी।, लाइन 112) में जा रहा है या नहीं। यदि ऐसा है, तो यह बफर दर्शक का उपयोग करता है अन्यथा यह व्यवहार करता है cat

बैश में आप परीक्षण का उपयोग कर सकते हैं (देखें man test)

  • -t FD फ़ाइल डिस्क्रिप्टर FD एक टर्मिनल पर खोला जाता है
  • -p फ़ाइल मौजूद है और एक नामित पाइप है

उदाहरण:

[[ -t 1 ]] && \
    echo 'STDOUT is attached to TTY'

[[ -p /dev/stdout ]] && \
    echo 'STDOUT is attached to a pipe'

[[ ! -t 1 && ! -p /dev/stdout ]] && \
    echo 'STDOUT is attached to a redirection'

1
@tfh यदि STDOUT किसी पाइप या पुनर्निर्देशन से जुड़ा नहीं है, तो यह सही है कि वे प्रिंट नहीं करते हैं कि STDOUT पाइप या रीडायरेक्शन से जुड़ा हुआ है। तीनों को एक स्क्रिप्ट में रखें। कॉल bash script.sh, bash script.sh | cat, bash script.sh > file, और देखते हैं कि उत्पादन आप मिलता है।
hvd

1
stdoutऐसी कोई चीज़ नहीं है जिसे "फ़ाइल में लिखा जाए"। यह आप के write() लिए कुछ हैlessइसके उत्पादन, फ़ाइल, पाइप, सॉकेट, या ब्लॉक डिवाइस, या जो कुछ भी है, उसके आधार पर अलग से कुछ भी नहीं करना है। यह केवल इतना ही मायने रखता है कि यह एक छोटा मामला नहीं है, इसलिए यह सिर्फ व्यवहार करता है cat। (मुझे लगता है कि आप यह जानते थे और इसे समझाने के लिए सिर्फ गलत शब्दों को चुना था, लेकिन मुझे लगा कि मैं अन्य पाठकों के लिए इसे इंगित करूंगा)।
पीटर कॉर्ड्स

तो आपका मतलब है कि मेरे विशिष्ट प्रश्न में बिल्ली की तरह व्यवहार करना कम काम है - या अधिक सामान्य: एक पाइपलाइन में अगले आदेश की तरह व्यवहार करें। मैंने जो समझा, उससे मैं यह नहीं मान सकता कि एक ही उपकरण में एक ही व्यवहार लागू किया गया है।
tfh

@tfh: नहीं, less"फिगर आउट" नहीं है जो कि catअगले है। यह सिर्फ इस बात की catपरवाह किए बिना है कि आगे क्या है, अगर यह स्टडआउट नहीं है।
पीटर कॉर्ड्स

@ मिचेल्ड .: धन्यवाद, मेरा जवाब सही। मैंने अभी अनुमान लगाया है कि lessटर्मिनल आयामों को प्राप्त करने के लिए आगे जाकर एक टीसीजीईटीएस का उपयोग किया जाएगा या पता चलेगा कि यह एक छोटा नहीं है, लेकिन जाहिर है मैंने गलत अनुमान लगाया है।
पीटर कॉर्ड्स

6

lessजाँचता है कि क्या stdoutयह एक टर्मिनल है, और catयह तब व्यवहार करता है जब यह नहीं होता है (प्रतियां ईओडी तक स्टडआउट नहीं करता है)।

यह सुविधा आपको स्क्रिप्ट या प्रोग्राम लिखने की सुविधा देती है जो हमेशा अपने आउटपुट (जैसे --helpआउटपुट) को भेजते हैं, lessजबकि एक फ़ाइल को आसान पुनर्निर्देशन की अनुमति देते हुए। यह चूसना होगा अगर some_command --fullhelp > help.txtअभी भी पाठ के माध्यम से पृष्ठ पर स्पेस-बार के लिए इंतजार किया गया, या कुछ और। कुछ कमांड (जैसे man) जाँच करते हैं कि उनका अपना आउटपुट यह तय करने के लिए है कि उनके आउटपुट को पेजर के माध्यम से भेजा जाए या नहीं। यदि आप दौड़ते हैं man ls > ls.txt, तो यह कभी भी आपका आह्वान नहीं करता है $PAGER

lessयदि आप एक लाइनर से बाहर एक पाइप लाइन में अधिक चरणों को जोड़कर संपादित करना भूल जाते हैं, तो बिल्ली की तरह व्यवहार करना आसान है।


lessटर्मिनल आयामों का पता लगाने की जरूरत है (स्क्रीन का आकार, यह जानने के लिए कि एक बार में कितनी लाइनें दिखानी चाहिए)। ioctl(2)उस पर का उपयोग करता है stdoutएक गैर टर्मिनल पर ENOTTY वापसी होगी, तो यह वैसे भी गैर टर्मिनल मामले से निपटने से बचने नहीं कर सकते। lessवास्तव isatty(3)में टर्मिनल आयामों की जाँच करने से पहले उपयोग करता है , लेकिन isattyकेवल एक ioctl की कोशिश करके और त्रुटि की कमी के लिए जाँच करके काम करता है।

यहां तक ​​कि एक साधारण पेजर जैसे more(1)(कम से कम उपयोग-लिनेक्स संस्करण) में यह सुविधा है, क्योंकि यह शायद उस मामले के लिए लागू करने का सबसे सरल समझदार व्यवहार है।


ध्यान दें कि जब आप किसी चीज़ को पाइप करते हैंless (उदाहरण के लिए grep foo bar.txt | less), तो उसे /dev/ttyकीबोर्ड इनपुट के लिए खोलना होगा । (आप इसे ऐसा करने के साथ देख सकते हैं echo foo | strace less)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.