การกะพริบเกิดขึ้นเนื่องจากสคริปต์ล้างทั้งหน้าจอ ถ้ามันเขียนทับข้อความที่มีอยู่และล้างเฉพาะเมื่อจำเป็นก็จะไม่มีการริบหรี่
นี่คือตัวอย่าง:
#!/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ขอหน้าจอปัจจุบันจากระบบ
อ่านเพิ่มเติม:
clear | hexdump -C?