삭제시 텍스트 / 화면 깜박임 방지


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-- 2018 년

질문을 확장했습니다.
ravnur

stackoverflow.com/questions/5367068/ 에서 다른 솔루션을 찾았습니다 .- echo -en "\ec"너무 깜박입니까?
ott--

나도 이걸 찾았 어 답변의 두 변형도 모두 깜박입니다.
ravnur

이 도구로 성공했습니다 : spare.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터미널 의 기능을 사용하여 현재 위치에서 화면 끝까지 인쇄합니다.

당신이 크기 조정 화면을 처리하기 원한다면, 당신이 할당을 움직일 수 ROWSCOLS외부 루프 내부에, 예를 들면,

#!/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

토마스 딕키에게 감사합니다.
mbarkhau

9

깜박임을 방지하는 한 가지 방법은 화면을 지우고 다시 그리는 데 최소 시간이 걸리도록 화면을 지우기 전에 모든 출력을 얻는 것입니다. 이것은 이중 버퍼링의 개념과 유사합니다.

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

이것은 깜박임을 완전히 제거하지는 않지만 내 경험에서 훨씬 덜 자주 발생합니다.


더블 버퍼링은 다른 상황과 마찬가지로 하루를 보호합니다 :-)
Ikke

매력처럼 일했다. 아니 모든 :) 점멸하지 않습니다
라스 Juel 젠슨

1
clear버퍼에 버퍼 를 포함시켜 나머지 깜박임을 제거 할 수 있습니다 output=$(clear; do_a_lot_of_output_here).
kdb

@kdb 좋은 제안입니다! 이것은 거의 깜박임을 제거하고 허용되는 답변보다 훨씬 간단합니다.
Michael Mior

이것은 매력처럼 작동합니다! 처음에는 'echo "$ output"'에서 큰 따옴표를 놓친 다음 줄이 모두 흐려졌습니다. (모든 공백은 단일 공백으로 간주됩니다.)
팝업

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같은 결과를 시도했다 (깜박임)
ravnur

커서를 숨기려면 스크립트에 몇 줄을 추가했습니다.

커서 없음-점프 없음. 그러나 유물에 대해서는? 출력에 임의의 양의 행이 있습니다. 새 출력을 시작하기 전에 모든 스크립트를 공백으로 채워야합니까? 그러나 어쨌든, 당신의 시간과 노력에 감사드립니다 : 그 일에 대해 +1하지만 문제가 해결되지 않습니다
ravnur

모든 유물을 제거하는 한 가지 방법 만 찾았습니다 tput ed. 그러나 그것은 깜박임
ravnur

어떤 터미널 에뮬레이터를 사용하고 있습니까? 와 tput ed바로 앞에 do_a_lot...선 나는 urxvt하지만 xterm이나 또는 보안 목표 명세서에 깜박이는보고있다.

1

Cristian의 답변을 확장하여 콘솔 창이 명령 출력보다 작을 때 작동하는 다음 bash 기능을 만들었습니다.

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

항상 업데이트중인 git 상태 출력을 표시합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.