터미널 끝에 도달하면 배경색이 비어 있습니다.

터미널 끝에 도달하면 배경색이 비어 있습니다.

텍스트 서식 지정을 위해 제어 시퀀스를 사용하고 있는데 예상치 못한 동작을 발견했습니다. 출력할 텍스트가 있고 해당 텍스트 중간에 배경색으로 강조 표시된 작은 텍스트 블록이 있습니다. 원본 텍스트는 매우 길어서 여러 줄이 걸릴 수 있으므로 중간에 있는 컬러 텍스트 블록이 한 줄에서 시작하여 다른 줄에서 끝나는 여러 줄로 나타날 수 있습니다. 터미널 창 하단에 도달하고 많은 공백이 색상으로 바뀔 때까지 모든 것이 잘 작동하는 것 같습니다.

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

재현 가능한 스크립트는 다음과 같습니다.

# color.sh
echo -e 'default \x1B[43m color \n color \x1B[49m default';

보시 \n다시피 재현을 위해 텍스트 블록에 줄바꿈을 추가했습니다. 하지만 이것이 제 경우입니다. 텍스트가 길고 한 줄에 맞지 않으면 컬러 블록이 여러 줄로 나누어집니다. 결과는 다음과 같습니다. 텍스트 뒤에는 같은 색상의 공백이 옵니다.

# color-long.sh
echo -e 'default default default default default default default default default \x1B[43m color color \x1B[49m default';

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

Ubuntu 14.04에서 이 문제를 얻었지만 Yosemite 10.10에서도 동일한 동작을 재현할 수 있었습니다.

echo이 동작의 원인이 무엇인지 , 다른 출력 유틸리티를 사용하지 않고(대신) 동일한 제어 시퀀스를 사용하여 문제를 해결하는 방법을 알고 싶습니다 . 텍스트를 제어할 수 있지만 출력 프로세스는 제어할 수 없습니다.

\[\x1B[43m\]와 같은 시퀀스 래핑을 시도했지만 \001\x1B[43m\002결과가 나오지 않고 []텍스트에 내용을 추가하거나 인식할 수 없는 기호가 출력될 뿐입니다.

답변1

이것이 최종 특정 동작이라는 @hildred에 동의하지만 몇 가지 의견 차이가 있습니다.

  • 응용 프로그램이 대체 화면(예: 적절한 터미널 설명과 함께 xterm에서 실행되는 전체 화면 프로그램)으로 전환되는 경우 스크롤백 버퍼로 텍스트가 이동되지 않습니다.
  • "옳은" 행동이나 "잘못된" 행동은 없으며 오직 관례만 있을 뿐입니다.
  • 터미널 설계에는 (아마도) 독립적으로 관련된 여러 기능이 있습니다.
  • 관례(및 Linux 콘솔, xterm 및 약간 다른 rxvt와 같은 일부 예)로 인해 많은 색상의 터미널이 유사하게 동작합니다.
  • ncurses FAQ내 터미널에 색칠되지 않은 공간이 표시됩니다.자세한 내용은.

규칙은 강력한 논거입니다. 프로그램은 변경되지 않는 이러한 디자인 선택에 의존합니다. 문제의 원인에 대한 몇 가지 예를 보려면 다음 시나리오를 고려하십시오.

최근 VTE 버그 보고서,#754596흥미로운 독서를 제공합니다. VTE 개발자는 동작을 변경하고 무슨 일이 일어나는지 살펴보라고 제안하는 것 같습니다.

우선, 다음 개발 주기에서 코드를 "수정"하고(_vte_terminal_cursor_down()에서 "xterm 일치 및 스크롤 시 새 줄 채우기" 6줄 제거) 문제에 대해 불만을 제기하는 사람이 있는지 확인할 수 있습니다. 그러면 상황을 더 잘 이해할 수 있을 것입니다.

답변2

이는 bash와는 아무 관련이 없으며 순전히 터미널 동작(특히 스크롤)의 효과입니다. 화면 하단에 도달하여 다음 줄에 입력을 시작하면 터미널은 모든 것을 한 줄 위로 밀어서 새로운 빈 줄을 만듭니다. (이전 터미널에서는 맨 위 줄이 파괴됩니다. 최신 터미널에서는 맨 위 줄이 스크롤백 버퍼로 푸시됩니다.) 이제 퍼즐은 다음과 같습니다. 새 줄은 어떤 색인가요? 전경색은 안보여서 문제가 아니지만, 배경색이 문제입니다. . . (검은 회색이나 흰색(혹은 실제로는 같은 색인 검은 녹색, 밝은 녹색, 호박색)이 될 수 있다고 주장하기 시작하던 시절 검은색만을 이용한 실험도 있었지만 불만도 있었습니다. 확실히 new 행(또는 화면 지우기의 경우 전체 화면 지우기)은 현재 배경색을 영향을 받는 영역의 배경색으로 사용하므로 이 동작은 대부분의 경우 올바른 작업을 수행하도록 의도된 것입니다.

그렇다면 원하는 행동을 얻기 위해 무엇을 하고 싶나요? 검정색 배경(또는 줄 끝)으로 다시 변경할 때 줄 끝 부분에 클리어를 보내면 나머지 줄의 배경색이 설정됩니다.

관련 정보