Việc nhấp nháy xảy ra vì tập lệnh xóa toàn bộ màn hình. Nếu nó vẽ lên văn bản hiện có và chỉ xóa khi cần thiết, thì sẽ không có nhấp nháy.
Đây là một ví dụ:
#!/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
Nó làm điều này:
- in đầu ra từ lệnh đã cho sẽ vừa trên màn hình (không bao bọc hoặc cuộn)
- ghi trên các dòng hiện có, xóa phần của mỗi dòng không bị ghi đè
- sử dụng
ed
khả năng của thiết bị đầu cuối của bạn để in từ vị trí hiện tại đến cuối màn hình.
Nếu bạn muốn xử lý một màn hình có thể thay đổi kích thước, bạn có thể di chuyển các bài tập đến ROWS
và COLS
bên trong vòng lặp bên ngoài, ví dụ:
#!/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
bởi vì tput
yêu cầu sàng lọc hiện tại từ hệ thống.
Đọc thêm:
clear | hexdump -C
?