Bash가 텍스트 깜박임을 멈추게 할 수 있습니까?

Bash가 텍스트 깜박임을 멈추게 할 수 있습니까?

나는 bash를 가지고 놀았고 다른 명령을 실행하면 깜박이는 텍스트를 멈출 수 있는지 궁금했습니다. 예를 들어 echo -e '\033[5mEXAMPLE\033[0m'깜박이는 EXAMPLE텍스트가 출력되지만 두 번째 명령을 실행하면 텍스트 깜박임을 중지할 수 있는지 알고 싶습니다.

답변1

전송 <ESC>[5m시퀀스는 지금부터 표시되는 문자의 깜박임 속성을 설정하도록 터미널에 지시합니다.

대부분의 터미널에서는 <ESC>[25m이 이후에 전송될 문자가깜박거리다숙소가 폐쇄되었습니다. , 회전과 <ESC>[0m동일<ESC>[m모두굵게, 강조 표시, 색상 등을 포함한 문자 렌더링 속성이 꺼집니다. 단순한 깜박임 그 이상입니다.

이러한 시퀀스를 보내도 이미 표시된 내용은 변경되지 않습니다.

EXAMPLE화면의 특정 위치가 깜박임을 멈추게 하려면 EXAMPLE동일한 위치에 새로운 깜박임을 보낸 다음 덮어써야 합니다.

예를 들어:

printf '\r\33[5m%s\33[25m' EXAMPLE; sleep 5; printf '\r%s\n' EXAMPLE

깜박이는 문자가 표시되고 EXAMPLE5초 후에 커서를 줄의 시작 부분으로 다시 이동하고(CR은 \r커서를 처음으로 이동이라고도 함) 깜박이지 않는 문자로 덮어씁니다 EXAMPLE.


일부 터미널의 경우 다음 명령을 사용하여 표시 영역에 있는 모든 문자의 속성을 변경할 수도 있습니다.<ESC><top>;<left>;<bottom>;<right>25$r DECCARA 이스케이프 시퀀스, 경계가 지정되지 않은 경우 기본값은 전체 화면입니다. 이것DECSACE이스케이프 시퀀스<top>;<left>합계 <bottom>;<right>좌표가 첫 번째 및 마지막 문자인지 또는 직사각형 영역의 모서리인지 확인하기 위해 전송될 수 있습니다.

예:

printf '\33[;;;;$r'

전체 화면에서 모든 깜박임을 제거합니다.

화면에서 특정 연속 텍스트의 깜박임을 제거하려면 해당 텍스트의 첫 번째 문자와 마지막 문자의 좌표를 알아야 합니다.

이스케이프 시퀀스를 사용하여 커서 위치를 쿼리할 수 있습니다 <ESC>[6n.

를 사용하면 다음을 사용하여 bash이 작업을 수행하고 <ESC>[<y>;<x>R응답을 읽을 수 있습니다.

getpos() { IFS=$'\e[;' read -rsdR -p $'\e[6n' _ _ "$2" "$1"; }

사용자가 동시에 또는 이전에 아무것도 입력하지 않았다고 가정합니다.

  • pRompt로 전송된 이스케이프 시퀀스
  • 응답이 화면에 표시되지 않도록 비활성화 read를 알려줍니다.echo-s
  • 응답은 리미터 r까지 읽혀집니다.R d
  • FS모든 <ESC>, , 문자에 대해 [필드 분할을 수행 ;하고 결과 필드를 _, _및 변수 $2에 저장합니다 $1.

그래서 당신은 이것을 할 수 있습니다 :

printf '\33[5m%s\33[25m\n' 'Some earlier blinking text'
getpos x1 y1; printf '\33[5m%s\33[25m%s' EXAMPLE; getpos x2 y2
printf ' \33[5m%s\33[25m\n' 'Some extra blinking text'
echo 'Some more text'

나중에 스크롤이 없다고 가정하면 다음과 같습니다.

printf '\33[%s;%s;%s;%s;25$r' "$y1" "$x1" "$y2" "$x2"

위의 모든 것에서는 printf대신 echo에 다른 셸이나 다른 빌드/버전/설정에서 이식 가능하도록 만드는 데 사용합니다. printfBash 및 대부분의 다른 printf구현 에 내장된 기능을 \e사용 하면 \33.


여기에 언급된 다른 이스케이프 시퀀스보다 훨씬 더 좁게 지원됩니다. 또한 tmux호스트 터미널에서 지원하더라도 지원되지 않는다는 점에 유의하세요. screen시퀀스를 호스트에 전달하도록 설득할 수 있지만 분할 창에서는 여전히 제대로 작동하지 않습니다.

답변2

깜박이는 텍스트

tput blink

복구 기능

tput sgr0

예를 들어

tput blink; echo This is blinking text; tput sgr0

또는

blink=$(tput blink) noblink=$(tput sgr0)
printf '%s\n' "Here we go: ${blink}this blinks${noblink} and this is steady"

이 기능과 커서를 위쪽( tput cuu1) 또는 절대 위치( tput cup Y X왼쪽 위 모서리의 -(0,0))로 이동하는 기능을 사용하면 깜박이지 않는 텍스트로 깜박이는 텍스트를 자유롭게 덮어쓸 수 있습니다.

terminfo에 대해 자세히 읽어 볼 가치가 있습니다. 현재 커서 위치를 저장하고 새 위치로 이동하여 텍스트를 작성한 다음 해당 위치를 복원할 수도 있습니다. 터미널이 이를 지원하지 않으면 $TERM현실과 일치하는 한 근사값으로 되돌아갑니다.

관련 정보