고쳐 쓰다

고쳐 쓰다

터미널 출력에서 ​​배경색을 켜거나 끄려고 할 때 이상한 동작이 발생합니다.

#!/bin/sh

printf "\e[48;5;203m"
printf "AAA\n"
printf "\e[0m"

printf "BBB\n"
printf "CCC\n"

AAA빨간색 배경으로 인쇄한 후 배경색을 끄고 다음 줄을 인쇄하고 싶습니다 . 그러나 출력은 다음과 같습니다.

여기에 이미지 설명을 입력하세요.

고쳐 쓰다

좋습니다. 새 터미널에서 시도해 보았는데 예상대로 작동했습니다. 하지만 그림에 표시된 대로 출력을 얻는 이전 터미널 창을 여전히 엽니다. 거기서 무슨 일이 일어 났어? 이 문제를 일으키는 "정크"가 터미널에 남아 있습니까?

reset이전 터미널 창에서 이 작업을 수행했는데 이제 출력이 정확합니다 .

답변1

AAA\n인쇄할 때터미널 맨 아래에, 터미널은 텍스트를 스크롤하고 하단에 빈 줄이 나타나도록 해야 합니다. 현재 배경색(빨간색)을 사용하여 행을 표시합니다. 그런 다음 BBB\n자체 배경색을 사용하여 해당 배경에 인쇄합니다. 새로운 배경색은 BBB현재 줄( )의 일부 문자에만 영향을 주지만 다음 빈 줄이 나타날 때는 관련이 있습니다. 실제로 다음 줄( CCC표시되는 위치)은 정상적으로 보입니다.

AAA\n하단에 인쇄하지 않을 때 터미널은 줄을 추가할 필요가 없으며 공백이 이미 있습니다. 공백이 검은색이 되는 일이 발생합니다.

재현하려면 터미널 하단과 "너머"에 도달할 때까지 코드를 여러 번 실행하세요.

다음 두 명령(각각 자체 터미널에서)을 반복하면 맨 아래에 도달할 때까지 동일한 출력으로 보이는 결과가 제공됩니다.

  1. printf "\e[48;5;203mAAA\n\e[0m"
    
  2. printf "\e[48;5;203mAAA\e[0m\n"
    

두 번째 경우에는 배경이 재설정됩니다.앞으로 \n.

내 테스트 플랫폼: Konsole 21.12.3 TERM=xterm-256color, .

답변2

@Kamil Maciorowski가 답변했듯이 배경색을 복원해야 합니다.앞으로줄바꿈을 인쇄합니다.

그러나 다음 사항에 따라 예상치 못한 배경색이 나타날 수도 있습니다.

  • 암시적인 줄 바꿈이 있습니까(인쇄하는 텍스트가 터미널보다 넓습니다),
  • 터미널을 스크롤하는지 여부
  • 터미널 에뮬레이터의 구체적인 선택은 다음과 같이 요약됩니다.
    • "배경색 삭제"(bce) 구현 여부,
    • 표준(xterm) 구현에서 (의도적 또는 의도하지 않은) 편차가 있는지 여부.

당신은 관심이 있을 수도 있습니다https://bugzilla.gnome.org/show_bug.cgi?id=754596xterm의 bce 처리 시 피할 수 없는 문제를 설명하는 흥미로운 세부 정보와 VTE(GNOME 터미널 등)가 기존 응용 프로그램에서 알려진 회귀를 일으키지 않는 방식으로 문제를 해결하기 위해 의도적으로 동작을 변경한 방법을 설명합니다.

관련 정보