स्पष्ट करते समय टेक्स्ट / स्क्रीन ब्लिंकिंग को रोकें


11

मेरी स्क्रिप्ट कुछ ऐसा कर रही है:

while :;
   clear

   do_a_lot_of_output_here

   sleep 1
done

जब मैं स्पष्ट और आउटपुट कर रहा हूं तो क्या स्क्रीन को पलक झपकने से रोकने के लिए कोई विकल्प है? मैं इसे watchकमांड की तरह करना चाहता हूं (लेकिन इसमें लिखा है C)। कोई सलाह?

clear | hexdump -C

00000000  1b 5b 48 1b 5b 32 4a                              |.[H.[2J|
00000007

पुनश्च। मैं bashकेवल उपयोग कर रहा हूं ।


क्या आप अपना आउटपुट जोड़ सकते हैं clear | hexdump -C?
ott-- 21

मैंने प्रश्न का विस्तार किया है।
रावण

मुझे stackoverflow.com/questions/5367068/… पर एक और समाधान मिला - क्या echo -en "\ec"फ्लैश भी है?
ott--

मुझे भी यही मिला। उत्तर फ्लैश से भी दोनों वेरिएंट।
रावण

: मैं इस उपकरण के साथ सफलता मिली excess.org/article/2009/07/watch1-bash-unicode
Raine

जवाबों:


8

चमकती होती है क्योंकि स्क्रिप्ट पूरी स्क्रीन को साफ करती है। यदि यह मौजूदा पाठ पर पेंट करता है और केवल आवश्यकतानुसार ही साफ करता है, तो कोई चंचलता नहीं होगी।

यहाँ एक उदाहरण है:

#!/bin/sh
watchit() {
    HOME=$(tput cup 0 0)
    ED=$(tput ed)
    EL=$(tput el)
    ROWS=$(tput lines)
    COLS=$(tput cols)
    printf '%s%s' "$HOME" "$ED"
    while true
    do
        CMD="$@"
        ${SHELL:=sh} -c "$CMD" | head -n $ROWS | while IFS= read LINE; do
            printf '%-*.*s%s\n' $COLS $COLS "$LINE" "$EL"
        done
        printf '%s%s' "$ED" "$HOME"
        sleep 1
    done
}

watchit top -b -n 1

यह ऐसा करता है:

  • दिए गए कमांड से आउटपुट प्रिंट करता है जो स्क्रीन पर फिट होगा (कोई रैपिंग या स्क्रॉलिंग नहीं)
  • मौजूदा लाइनों पर लिखते हैं, प्रत्येक पंक्ति के हिस्से को साफ़ करते हैं जो ओवरराइट नहीं किया जाता है
  • edवर्तमान स्थान से स्क्रीन के अंत तक प्रिंट करने के लिए आपके टर्मिनल की क्षमता का उपयोग करता है ।

यदि आप एक आकार बदलने योग्य स्क्रीन को संभालना चाहते हैं, तो आप बाहरी लूप के अंदर ROWSऔर COLSअंदर असाइनमेंट को स्थानांतरित कर सकते हैं , जैसे,

#!/bin/sh
watchit() {
    HOME=$(tput cup 0 0)
    ED=$(tput ed)
    EL=$(tput el)
    printf '%s%s' "$HOME" "$ED"
    while true
    do
        ROWS=$(tput lines)
        COLS=$(tput cols)
        CMD="$@"
        ${SHELL:=sh} -c "$CMD" | head -n $ROWS | while IFS= read LINE; do
            printf '%-*.*s%s\n' $COLS $COLS "$LINE" "$EL"
        done
        printf '%s%s' "$ED" "$HOME"
        sleep 1
    done
}

watchit top -b -n 1

क्योंकि tputसिस्टम से वर्तमान स्क्रीन के लिए पूछता है।

आगे की पढाई:


1
उन लोगों के लिए जो कुछ कार्यों के साथ एक छोटे से स्टैंड-अलोन स्क्रिप्ट में एम्बेडेड #!/bin/bashका उपयोग करना चाहते watchitहैं, आप कर सकते हैं export -f function_name; watchit function_name
समुच्चय

यह मेरे लिए पूरी तरह से काम करता है सिवाय इसके कि मैं स्क्रीन के शीर्ष पर मजाकिया मुद्दों में भाग गया, जहां चीजें शिफ्ट हो जाती हैं और पाठ के लंबे समय तक गड़बड़ हो जाती हैं (कुछ भी छोटा हो जाता है head)। लगता है कि समस्या एक ऑफ-बाय-एरर है (कम से कम मेरे सेटअप में - विभाजन सत्रों में सत्र सत्र, iTerm2) पंक्तियों की संख्या की गणना करते समय। ROWS=`expr $(tput lines) - 1`यह पूरी तरह से संबोधित किया।
ओहरुनुरुस

यह अद्भुत है, बहुत बहुत धन्यवाद @ थोमस-डिक्की।
mbarkhau

9

चमकती को रोकने में मदद करने का एक तरीका स्क्रीन को साफ़ करने से पहले सभी आउटपुट प्राप्त करना है ताकि इसे साफ़ करने और इसे फिर से तैयार करने के बीच न्यूनतम समय हो। यह डबल बफरिंग की अवधारणा के समान है:

while :; do
   output=$(do_a_lot_of_output_here)
   clear
   echo "$output"
   sleep 1
done

यह पूरी तरह से झिलमिलाहट को खत्म नहीं करता है, लेकिन यह मेरे अनुभव में बहुत कम बार होता है।


डबल बफ़रिंग, किसी भी अन्य स्थिति की तरह, दिन को सुरक्षित करता है :-)
Ikke

एक जादू की तरह काम किया। कोई टिमटिमाता नहीं है :)
लार्स जुएल जेन्सेन

1
शेष टिमटिमा clearको बफर में शामिल करके समाप्त किया जा सकता है , अर्थात output=$(clear; do_a_lot_of_output_here)
kdb

@kdb अच्छा सुझाव! यह लगभग पूरी तरह से मेरे लिए चंचलता को समाप्त करता है और स्वीकृत उत्तर की तुलना में बहुत सरल है।
माइकल मिओर

यह एक आकर्षण की तरह काम करता है! सबसे पहले मैंने 'इको "$ आउटपुट" में दोहरे उद्धरण चिह्नों को याद किया, और फिर लाइनें पूरी तरह से मिल गईं। (सभी व्हाट्सएप को सिंगल स्पेस माना जाता है।)
पॉपअप

5

चमकती लूप के चारों ओर हर बार स्क्रीन को साफ़ करने का एक अपरिहार्य परिणाम है। आप कर्सर को स्क्रीन के शीर्ष पर ले जा सकते हैं और इसके बजाय अपने पुराने आउटपुट के कुछ हिस्सों को अधिलेखित कर सकते हैं।

# You may want to do this if your code is in a script.
unhide_cursor() {
    printf '\e[?25h'
}
trap unhide_cursor EXIT

# Hide the cursor (there is probably a much better way to do this)
printf '\e[?25l'
clear 
while true ; do
    # Move the cursor to the top of the screen but don't clear the screen
    printf '\033[;H' 
    do_a_lot_of_output_here
    sleep 1
done

यदि आपकी आउटपुट सिकुड़ जाती है तो यह स्क्रिप्ट कलाकृतियों को छोड़ देगी। यह भी पोर्टेबल होने की बहुत संभावना नहीं है। मैंने केवल इसे urxvt, xterm और st के साथ परीक्षण किया है।


इस स्थिति में कर्सर यादृच्छिक स्थिति (और निश्चित रूप से कलाकृतियों) से आउटपुट के अंत तक कूदना शुरू कर देता है। इसके अलावा मैंने tput clearएक ही परिणाम (निमिष) के साथ कोशिश की
रवन्नर

मैंने कर्सर को छिपाने के लिए स्क्रिप्ट में कुछ पंक्तियों को जोड़ा।

कोई कर्सर नहीं - कोई कूद नहीं। लेकिन कलाकृतियों के बारे में? आउटपुट में रैंडम राशि होती है। क्या मुझे नया आउटपुट शुरू करने से पहले सभी स्क्रिप्ट को रिक्त स्थान के साथ भरना होगा? लेकिन, वैसे भी, आपके समय और प्रयासों के लिए धन्यवाद: +1 मेरे लिए उससे लेकिन यह मेरे मुद्दे को हल नहीं करता है
रावण

मैं सभी कलाकृतियों से छुटकारा पाने के लिए केवल एक ही रास्ता मिल गया: tput ed। लेकिन यह पलक
झपकने का

आप किस टर्मिनल एमुलेटर का उपयोग कर रहे हैं? साथ tput edसही से पहले do_a_lot...लाइन, मैं urxvt नहीं बल्कि xterm या सेंट में निमिष दिखाई दे रही है।

1

क्रिस्टियन के उत्तर के विस्तार के रूप में, मैंने निम्नलिखित बैश फ़ंक्शन बनाया, जो काम करता है यदि कंसोल विंडो कमांड के आउटपुट से छोटी है:

function watcher()
{
    lines=$(tput lines)
    while true; do
        output="$($@ | head -n $lines)"
        clear
        echo -e "$output"
        sleep 2
    done
}

यह आपको चौकीदार को किसी भी आदेश को पारित करने की अनुमति देता है। यदि आप git का उपयोग कर रहे हैं, git config --global color.status alwaysतो उपयोग करें और फिर:

watcher git status

हमेशा अपडेट करने वाला गिट स्टेटस आउटपुट प्रदर्शित करेगा।

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