터미널 입력선을 터미널 상단에 유지하시겠습니까?

터미널 입력선을 터미널 상단에 유지하시겠습니까?

내가 찾고 있는 것이 무엇인지 정확히 설명하기 어렵기 때문에 터미널이 어떻게 작동하길 원하는지 설명하기 위해 몇 가지 샘플 출력을 만들었습니다. (라인 시작 부분의 각 숫자는 해당 라인에 대한 반환을 나타내고 >는 입력 라인을 나타냅니다.

>   me@computer:~$ 
5.  me@computer:~$ cat somefile                 < command
    start of file                               < output
                                                < output
    this                                        < output
    is                                          < output
    the                                         < output
    content                                     < output
    of                                          < output
    the                                         < output
    file                                        < output
                                                < output
    end of file                                 < output
4.  me@computer:~$ 
3.  me@computer:~$ 
2.  me@computer:~$ 
1.  me@computer:~$ echo this is the first line  < command
    this is the first line                      < output

이 예에서는 실행할 명령을 입력하는 입력 줄이 항상 맨 위에 있습니다. 말하자면 각 명령과 그 출력을 "이벤트"로 푸시합니다. 따라서 파일을 cat으로 지정하면 모든 내용이 역순으로 출력되므로 각 명령의 출력은 모양이 바뀌지 않고 위치만 달라집니다.

답변1

누군가 이미 이 작업을 수행했을 수도 있습니다(아닐 수도 있음). 이는 명령 출력을 수집하고 화면을 업데이트하는 방법을 알고 있는 셸을 통해 수행되어야 합니다. 일반 터미널은 이 작업을 자체적으로 수행하지 않습니다.

모든 명령에 대해 이 작업을 수행하는 프로그램이 있다고 가정합니다.

  • 입력 명령(여러 줄일 수 있음)이 허용됩니다. 단순화를 위해 먼저 입력을 한 줄로 제한합니다.
  • 텍스트를 가져온 후 쉘은 명령을 실행하여 명령의 표준 출력에서 ​​한 번에 한 줄씩 수집합니다.그리고실수.
  • 새로운 출력 줄을 얻으면 기존 텍스트를 아래로 밀어내면서 해당 줄을 화면에 삽입해야 합니다. 더 많은 출력을 읽으면 삽입 지점이 아래쪽으로 이동합니다. (터미널에서 제공낮은 수준운영이 도움이 될 수 있지만 성공하려면 아직 멀었습니다.일하다).
  • 화면이 수용할 수 있는 것보다 더 많은 출력이 있는 경우 사용자는 삽입 지점이 화면 하단에 도달할 때 출력이 위쪽으로 스크롤되기 시작하도록 할 수 있습니다.
  • 더 이상 출력이 없으면(명령이 중지됨) 쉘은 커서를 화면 상단으로 다시 이동합니다.

모두저것간단한 프로그램으로 가능합니다. 어려운 점은 명령이 화면 자체를 차지하려는 경우입니다. 이를 수행하는 프로그램은 (당신이 추측한 대로) 표준 출력 및 표준 오류에 기록됩니다. 그리고 그들은 일반 텍스트를 쓰지 않습니다. 화면 주위를 이동하기 위해 이스케이프 시퀀스를 사용합니다.

터미널 초기화 시퀀스를 전송하는 잘 동작하는 애플리케이션으로 이를 제한하면 쉘은 (원칙적으로) 이를 감지하고 일시적으로 포기하여 명령이 화면에 기록되도록 허용할 수 있습니다. 그러나 대부분의 응용 프로그램은 잘 작동하며 처리해야 할 흥미로운 특수 사례가 많이 있습니다.

답변2

흥미로운 아이디어지만 아직까지 이를 실현할 수 있는 제품은 없는 것 같습니다. 이를 위해 함께 협력해야 하는 상호 연관된 부분이 많이 있습니다.

터미널은 수십년의 증분 이력을 가지고 있고 항상 동일한 기본 방식으로 작동해왔기 때문에 터미널 작동 방식을 바꾸려는 시도가 많지 않았으며, 이를 완전히 변경하면 기존 응용 프로그램의 배포가 중단됩니다.

즉, 원하는 것을 수행하는 간단한 ncurses 애플리케이션을 작성하는 것은 그리 어렵지 않지만 기본 명령에서만 작동하고 완전한 터미널이 필요한 모든 것(예: vim, nano, screen, top wait)에서는 실패할 것입니다. . 그들을 지원하는 것은 많은 일이 될 것입니다.

그러나 최근 최신 터미널 애플리케이션을 만들려는 시도가 있었으며 그 중 일부는 이미지/비디오를 직접 표시할 수 있습니다.용어. 내가 본 것 중 가장 급진적인 것은검은 화면관심을 가질 수도 있습니다. 이는 정확히 여러분이 찾고 있는 것이 아니며 아직 개발 초기 단계에 있지만(문제가 발생할 수 있음) 원하는 작동 방식과 동일한 이점을 제공할 수 있습니다(명령 강조 표시는 매우 쉬울 수 있음). 명령 시작/중지 등의 출력을 참조하세요.

답변3

이 상상의 디자인이 모두 단말기를 좀 더 자연스럽게 읽을 수 있도록 돕기 위한 것이라면, 문제를 반대로 해결하는 것을 고려해 본 적 있으신가요?

  • 프롬프트는 항상 맨 아래에 있습니다.
  • 이전 명령과 출력은 화면 전체에 걸쳐 흐릅니다.

이는 기본적으로 터미널의 원래 동작을 재사용한다는 의미이며, 유일한 차이점은 터미널을 시작하고 즉시 프롬프트를 맨 아래로 푸시한다는 것입니다.

다음 코드 줄을 사용하여 이를 달성했습니다 ~/.bashrc.

__prompt_to_bottom_line() {
  tput cup $LINES
}
alias clear='clear && __prompt_to_bottom_line'

필요한 접근 방식은 출력 라인의 순서를 사소한 방식으로 변경해야 하기 때문에 문제가 있습니다.

  • 명령은 역순으로 제시되어야 합니다.
  • 그러나 각 명령의 출력은 원래 순서대로 표시되어야 합니다.

내 방법은 이러한 불균일함을 겪지 않습니다. 왜냐하면 내가 하는 일은 처음부터 팁을 바닥으로 밀어내는 것뿐이기 때문입니다.

본질적으로 내 화면은 tac여러분의 화면입니다(다시 말하지만 명령의 출력이 여러 줄인 경우 실제 tac편집이 아닙니다).

관련 정보