2010-11-13 13 views
23

अधिकतर, मैं खोल से प्रत्येक आदेश के लिए | less का उपयोग नहीं करूंगा।परिणाम मेरे शैल पर किसी पृष्ठ से अधिक होने पर स्वचालित रूप से पाइप कैसे करें?

पाइप से कम केवल तभी उपयोग किया जाता है जब मैं वास्तव में बिना आदेश चलाता हूं और पता लगाता हूं कि यह पृष्ठ पर फिट नहीं है। मुझे एक ही खोल कमांड के दो रन खर्च करते हैं।

क्या कोई तरीका है ताकि हर बार एक कमांड परिणाम एक प्रदर्शन पृष्ठ से अधिक हो, तो यह स्वचालित रूप से कम हो जाता है?

+3

@BenV: क्यों? यह मुझे शैल प्रोग्रामिंग के बारे में एक बिल्कुल अच्छा सवाल की तरह दिखता है। आउटपुट टीटी नहीं होने पर –

उत्तर

11

ऐसा करने की कोशिश करने के साथ सबसे महत्वपूर्ण समस्या यह है कि इसे चलाने के लिए इसे बंद करने के तरीके को कैसे बंद किया जाए।

मैं जो अनुशंसा करता हूं वह यह है कि, प्रोग्राम और उपयोगिताओं के लिए आप अक्सर उपयोग करते हैं, उन्हें खोलने वाले शैल फ़ंक्शंस बनाएं और less -F पर पाइप करें। कुछ मामलों में, आप इस कार्यक्रम को प्रोग्राम के समान नाम दे सकते हैं और इसे प्राथमिकता दी जाएगी, लेकिन इसे ओवरराइड किया जा सकता है।

यहाँ एक उदाहरण आवरण समारोह जो बढ़त मामलों को संभालने के लिए परीक्षण और शायद कुछ अतिरिक्त कोड की आवश्यकता होगी, आदि

#!/bin/bash 
foo() { 
    if [[ -p /dev/stdout ]] # you don't want to pipe to less if you're piping to something else 
    then 
     command foo "[email protected]" | less -F 
    else 
     command foo "[email protected]" 
    fi 
} 

आप उदाहरण के रूप में मेरे पास है ही नाम का उपयोग, तो इसके कई टूट सकता है जो विभिन्न व्यवहार की उम्मीद है। अंतर्निहित कार्यक्रम चलाने के लिए समारोह ओवरराइड करने के लिए सीधे command साथ आगे ले जाएँ:

command foo 

एक ही नाम के समारोह का उपयोग किए बिना foo चलेंगे।

+4

'कम' शानदार रूप से 'बिल्ली' में बदल जाता है। –

+0

कुछ स्थितियों में, 'कम-एफ' आउटपुट को फेंकने लगता है अगर यह एक पृष्ठ पर फिट हो सकता है।मैं यह नहीं पहचान सकता कि यह किस सेटिंग पर निर्भर करता है, हालांकि। –

+0

@ टी। वेरॉन: "फेंकने" से आपका क्या मतलब है? –

2

आप हमेशा कम करने के लिए पाइप कर सकते हैं (इससे फाइल के अंत में स्वचालित रूप से छोड़ने के लिए कम कारण होगा)। कम आउटपुट वाले कमांड के लिए यह वही होगा जो आप चाहते हैं। मुझे नहीं लगता कि बहुत सारे आउटपुट होने पर आप स्वचालित रूप से कम पाइप कर सकते हैं।

2

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

आप एक खोल लिख सकते हैं जो आपके लिए करता है - जो उत्पादन को कैप्चर करता है (लेकिन stderr के बारे में क्या?) और यदि आवश्यक हो तो पेजिनेट्स, लेकिन यह निश्चित रूप से मानक शेल नहीं होगा।

15

पाइप यह less -F उर्फ ​​--quit-if-one-screen रहे हैं:

कारण कम स्वचालित रूप से बाहर निकलने के लिए करता है, तो पूरी फ़ाइल डिस पहली स्क्रीन पर खेला जा सकता है।

0

मैंने इस रैपर फ़ंक्शन को लिखा और इसे मेरे .profile में रखा। आप इसे कमांड से पहले उपयोग कर सकते हैं और यदि यह 1 पेज से अधिक लंबा हो तो यह स्वचालित रूप से इसे कम कर देगा।

lcmd() 
{ 
    echo "$("[email protected]")" | less -F; 
}; 

तो 'lcmd ls' वर्तमान निर्देशिका और पाइप को आउटपुट कम करेगा।

+2

आउटपुट अधिकतम ईमानदार लाइन लंबाई से अधिक होने पर 'echo' का उपयोग करेगा। '" $ @ "| कम-एफ' पर्याप्त है। और अर्धविराम भी अनावश्यक हैं। – Kevin

संबंधित मुद्दे

 संबंधित मुद्दे