ক্লিয়ার করার সময় পাঠ্য / পর্দা ঝলকানো রোধ করুন


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?
অট--

আমি প্রশ্নটি প্রসারিত করেছি।
রাভনুর

আমি স্ট্যাকওভারফ্লো . com / প্রশ্নস / ৫5707070০ / / এ আরও একটি সমাধান পেয়েছি - এটি কি echo -en "\ec"ফ্ল্যাশ করে?
অট--

আমি এটিও পেয়েছি। উত্তর ফ্ল্যাশ থেকে উভয় রূপ।
রাভনূর

: আমি এই টুল দিয়ে সাফল্য ছিল excess.org/article/2009/07/watch1-bash-unicode
বালিকা

উত্তর:


8

ঝলকানি ঘটে কারণ স্ক্রিপ্ট পুরো স্ক্রিনটি সাফ করে। যদি এটি বিদ্যমান পাঠ্যের উপরে রঙ করে এবং কেবল প্রয়োজনীয় হিসাবে পরিষ্কার হয় তবে কোনও ঝাঁকুনি থাকবে না be

এখানে একটি উদাহরণ:

#!/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) চটকদার হয়ে উঠবে । সারিগুলির সংখ্যা গণনা করার সময় সমস্যাটি এক-বাই-ওয়ান ত্রুটি (কমপক্ষে আমার সেটআপে - বিভক্ত প্যানে ssh অধিবেশন, iTerm2) বলে মনে হচ্ছে। ROWS=`expr $(tput lines) - 1`এই নিখুঁতভাবে সম্বোধন।
ohruunuruus

এটি দুর্দান্ত, আপনাকে থোমাস-ডিকির অনেক ধন্যবাদ।
এমবরখাউ

9

ফ্ল্যাশিং প্রতিরোধে সহায়তা করার একটি উপায় হ'ল স্ক্রিন সাফ করার আগে সমস্ত আউটপুট পাওয়া যাতে এটি সাফ করা এবং পুনরায় আঁকনের মধ্যে সর্বনিম্ন সময় থাকে। এটি ডাবল বাফারিংয়ের ধারণার অনুরূপ:

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

এটি পুরোপুরি ঝাঁকুনি দূর করে না, তবে এটি আমার অভিজ্ঞতাতে উল্লেখযোগ্যভাবে কম ঘটে।


ডাবল বাফারিং, ঠিক অন্য কোনও পরিস্থিতির মতো, দিনটি
নিরাপদ করে

কবজির মতো কাজ করেছেন।
লার্স জুয়েল জেনসেন

1
বাকী ঝাঁকুনি clearবাফার মধ্যে অন্তর্ভুক্ত করে, যেমন output=$(clear; do_a_lot_of_output_here)
কেডিবি

@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 বা St মধ্যে জ্বলজ্বলে দেখছি।

1

ক্রিস্টিয়ানের উত্তরের সম্প্রসারণ হিসাবে, আমি নিম্নলিখিত বাশ ফাংশনটি তৈরি করে যা কাজ করে যদি কনসোল উইন্ডো কমান্ডের আউটপুট থেকে ছোট হয়:

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

এটি আপনাকে প্রহরীকে কোনও কমান্ড দেওয়ার অনুমতি দেয়। আপনি যদি গিট ব্যবহার করছেন git config --global color.status alwaysতবে ব্যবহার করুন এবং তারপরে:

watcher git status

সর্বদা আপডেট হওয়া গিট স্থিতির আউটপুট প্রদর্শন করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.