bash
프로그램에서 "롤백"과 "롤백 버퍼"란 무엇이며 screen
실행 중인 프로그램인 tty 및 stdin/stdout/stderr와 어떤 관련이 있습니까?
이것이 내가 지금까지 찾은 "롤백"의 유일한 정의입니다.아치리눅스 위키):
스크롤백은 사용자가 뒤로 돌아가서 화면 밖으로 스크롤된 텍스트 줄을 볼 수 있도록 하는 텍스트 콘솔에 구현된 기능입니다. 이는 롤백 버퍼를 위해 특별히 생성된 비디오 어댑터와 디스플레이 장치 사이의 버퍼를 통해 수행됩니다.
그러나 이로 인해 더 많은 질문이 발생합니다.
- "서브루틴"의 "함수"를 의미합니까, "함수"의 "함수"를 의미합니까?
- 이 스크롤백 버퍼에 대한 Unix 표준이나 API가 있습니까?
vim
터미널 에뮬레이터에서 실행되는screen
것과 같은 프로그램의 "스택"에서 이러한 프로그램 중 스크롤백 버퍼를 제어하는 프로그램은 무엇입니까?bash
ssh
나 screen
또한파일로 롤백 덤프. 파일 상단에는 많은 공백이 있으며 터미널 에뮬레이터가 표시하는 "보기"는 버퍼의 하단 몇 줄에 불과한 것 같습니다.
- 이와 같은 프로그램이
vim
상위 셸의 스크롤백 버퍼에 임시로 액세스할 수 있기 때문에 전체 터미널 창을 "지울" 수 있는 이유는 무엇입니까? vim
아니면 상위 스크롤백 버퍼 위에 어떻게든 오버레이된 자체 스크롤백 버퍼를 사용 합니까 ?
답변1
이것은 다소 복잡한 질문입니다. 나는 귀하의 질문에 차례로 답변하려고 노력할 것입니다. 그러나 먼저 일반적인 설명으로:
스크롤백 버퍼는 터미널 에뮬레이터( xterm
, Konsole, GNOME 터미널)에 의해 구현됩니다. 여기에는 터미널에서 실행되는 모든 프로그램의 표준 출력 및 표준 오류를 포함하여 화면에 표시되는 모든 텍스트가 포함됩니다. 이는 스크롤하여 지나간 과거 출력을 보거나 이전에 말한 내용을 확인할 수 있는 터미널 기능입니다.
스크롤백 버퍼는 긴 레코드 페이지의 출력으로 생각할 수 있고 터미널 창은 언제든지 일부만 볼 수 있는 창으로 생각할 수 있습니다. 아무것도 위로 스크롤하지 않으면 버퍼의 끝이 표시됩니다. 일반적으로 잊어버리기 전에 추적할 라인 수에 대한 제한이 터미널에 구성되어 있습니다.
한도가 1000개 행이라고 가정합니다. 세션의 처음 1000줄 출력의 경우 버퍼에 추가하고 세션 시작 부분까지 직접 스크롤할 수 있습니다. 1001번째 출력 라인을 얻으면 버퍼의 첫 번째 라인이 삭제되고 스크롤할 수 있는 가장 먼 라인이 세션의 두 번째 라인이 됩니다. 버퍼에는 항상 화면에 표시된 최신 1000줄의 출력이 포함되며 언제든지 위로 스크롤하여 이전 출력을 볼 수 있습니다.
"서브루틴"의 "함수"를 의미합니까, "함수"의 "함수"를 의미합니까?
이것이 바로 "기능"과 "특징"입니다. 터미널 에뮬레이터에는 화면 내용을 기록하고 화면 내에서 위아래로 스크롤할 수 있는 기능이 있습니다. 일부 시스템의 콘솔은 제한된 롤백도 지원합니다.
screen
일단 혼합되면 상황은 더욱 복잡해집니다. 이 시점에서는screen
스크롤백 버퍼 자체가 시뮬레이션됩니다. 따라서 X 선택을 사용하는 대신 프로그램에 복사하여 붙여넣을 수 있습니다.이 스크롤백 버퍼에 대한 Unix 표준이나 API가 있습니까?
짧은 대답은 '아니요'입니다. 터미널에서 제공하는 것뿐입니다. 더 긴 답변은 하단에서 찾을 수 있습니다.
화면에서 시작된 vim, 터미널 에뮬레이터에서 시작된 bash, ssh 시작과 같은 프로그램의 "스택"에서 이러한 프로그램 중 스크롤백 버퍼를 제어하는 프로그램은 무엇입니까?
vim
및 의 경우에는bash
제어할 수 없습니다(아래에서 다시 경고). 터미널은 셸에서 시작하여 터미널의 모든 프로그램에 대한 스크롤백 버퍼를 제공합니다.screen
위에서 언급했듯이 롤백 자체가 시뮬레이션되고 있습니다.또한 screen을 사용하여 롤백을 파일로 덤프합니다. 파일 상단에는 많은 공백이 있으며 터미널 에뮬레이터가 표시하는 "보기"는 버퍼의 하단 몇 줄에 불과한 것 같습니다.
이것이
screen
내부 버퍼입니다. 이때 화면에 표시되는 내용은 대개 버퍼의 하단 내용입니다.이것이 vim과 같은 프로그램이 상위 셸의 스크롤백 버퍼에 임시로 액세스할 수 있기 때문에 전체 터미널 창을 "지울" 수 있는 이유입니까?
이것은 상황이 더욱 복잡해지는 부분 중 하나입니다. 거의 모든 X 기반 터미널 에뮬레이터는 VT100을 에뮬레이션하며, 그들이 하는 한 가지는 지원입니다."대체 화면 버퍼". 순차 출력과의 대부분의 터미널 상호 작용에 사용되는 일반 버퍼와 달리 대체 화면 버퍼는 정확히 터미널 크기입니다. 표시되는 콘텐츠보다 크지 않기 때문에 위아래로 스크롤할 수 없습니다.
아이디어는 전체 화면 앱이 이미 화면에 있는 어떤 것의 방해도 받지 않고 필요한 작업을 수행한 다음 이전 디스플레이 상태로 되돌릴 수 있도록 하는 것입니다. 이것이 바로 입력할 때
vim
전체 화면을 채우지만, 떠나면 이전 터미널 출력(이전의 모든 프롬프트 및 명령 출력)이 다시 나타나는 이유입니다.vim
시작 시 대체 화면 버퍼로 전환하고 종료 시 일반 버퍼로 돌아갑니다.이 백업 버퍼는 위에서 언급한 주의 사항 중 하나입니다. 때때로 프로그램에는 버퍼로 수행할 작업을 터미널에 알려주는 기능이 있습니다.
screen
이 작업을 수행하는 또 다른 프로그램이 바로 이것이 스크린 세션에 있을 때 일반적으로 터미널의 스크롤 기능이 작동하지 않는 이유입니다.screen
스크롤백 버퍼 자체가 시뮬레이션되므로 이전 출력을 얻으려면 내부 기능을 사용해야 합니다.아니면 vim이 상위 스크롤백 버퍼 위에 어떻게든 겹쳐진 자체 스크롤백 버퍼를 사용합니까?
나는 주로 이전 질문에서 이 질문에 대답했지만, 이 특정 질문에 대한 짧은 대답은
vim
터미널에서 (스크롤백 없이) 자체 임시 버퍼를 가져온 다음 내부적으로 문서의 모든 스크롤을 수행한다는 것입니다.
내가 언급한 모든 예외는 다음과 같습니다.
이번에도 약간 더 복잡해집니다. 나는 애플리케이션이 롤백을 제어할 수 없으며 전적으로 터미널에서 제공한다고 말했습니다. 경우에 따라 특정 단말기와의 상호 작용이 제한됩니다. 프로그램은 특정 이스케이프 시퀀스를 인쇄합니다. 과거에 수동으로 터미널 색상 지정을 사용한 적이 있다면 그 모양을 볼 수 있습니다. 터미널은 이러한 시퀀스를 해석하고 동작을 변경할 수 있으며 정보를 프로그램으로 다시 보낼 수도 있습니다. 사용할 수 있는 이스케이프 시퀀스는 다음을 참조하세요.termcap(터미널 기능) 데이터베이스.
일부 터미널은 스크롤백 버퍼에 대한 제한된 쿼리와 작업을 지원합니다. 많은 xterm
파생 항목에는 터미널이 보기를 스크롤하게 할 수 있는 이스케이프 시퀀스가 있습니다. 많은 터미널에서는 스크롤할 화면의 특정 영역을 지정하고 나머지 부분은 변경하지 않는 기능도 지원합니다. 이로 인해 스크롤백 버퍼가 손상되는 경향이 있습니다.
거의 모든 터미널은 화면 주위로 커서를 이동하는 시퀀스를 지원하며, 이는 ncurses
라이브러리가 디스플레이의 모든 다른 부분을 업데이트할 수 있는 방법입니다. 당신은 볼 수 있습니다VT100 직렬 지원xterm
. 스크롤백 버퍼와 상호 작용하는 방식은 때때로 약간 이상할 수 있습니다. 특히 command와 같은 자체 스크롤 동작을 구현하는 경우 더욱 그렇습니다 less
. less
터미널이 예상하지 못한 방식으로 텍스트가 맨 위에 다시 그려지기 때문에 스크롤백에서 줄이 중복되거나 누락될 수 있습니다. 다른 프로그램에서는 때때로 전체 디스플레이의 여러 복사본으로 버퍼를 채우게 됩니다.