나는 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
깜박이는 문자가 표시되고 EXAMPLE
5초 후에 커서를 줄의 시작 부분으로 다시 이동하고(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"; }
사용자가 동시에 또는 이전에 아무것도 입력하지 않았다고 가정합니다.
p
Rompt로 전송된 이스케이프 시퀀스- 응답이 화면에 표시되지 않도록 비활성화
read
를 알려줍니다.echo
-s
- 응답은 리미터
r
까지 읽혀집니다.R
d
F
S
모든<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
에 다른 셸이나 다른 빌드/버전/설정에서 이식 가능하도록 만드는 데 사용합니다. printf
Bash 및 대부분의 다른 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
현실과 일치하는 한 근사값으로 되돌아갑니다.