I/O 전달에는 여러 지점이 있으며 그 중 일부는 (내가 아는 한) 쉘, pty, tty, termios, 터미널 에뮬레이터 애플리케이션입니다. 대부분의 터미널 에뮬레이터에서는 사용자가 Enter 키를 눌러 명령을 제출하기 전에 긴 명령줄(현재 $COLUMNS를 넘어서는 줄)이 줄바꿈됩니다. 또한 예상대로 명령줄에서 적절한 수의 문자가 제거되면 줄이 위 줄로 거꾸로 줄바꿈됩니다.
내 질문은: 이 마법은 일반적으로 어디에서 처리됩니까? 셸의 일부인 termios 설정입니까, 아니면 이를 담당하는 터미널 에뮬레이터 응용 프로그램입니까?
더 자세한 설명을 위해 Ubuntu에서 Terminator 터미널 에뮬레이터 응용 프로그램을 사용하고 있습니다. 여기서 개행 문자는 잘 작동합니다(따라서 $PS1 프롬프트도 괜찮을 것입니다). 하지만 go pty generateer(github.com/kr/pty)와 함께 작동하는 자체 터미널 에뮬레이터 응용 프로그램을 개발 중이며 줄 바꿈이 없지만 줄 시작 부분에 동일한 줄이 있는 긴 줄에 문제가 있습니다. 철사.
답변1
대부분의 터미널 에뮬레이터에서는 사용자가 Enter 키를 눌러 명령을 제출하기 전에 긴 명령줄 [...]이 줄 바꿈됩니다.
이것터미널 에뮬레이터 기능이 아닙니다.
이것은 쉘의 기능입니다. 귀하의 쉘은 전체 화면 응용 프로그램이 아니지만 다음을 수행하고 있습니다.커서 주소 지정.
셸에서 명령줄을 편집할 때 셸의 줄 편집 라이브러리는 편집 중인 줄이 표시되는 방식을 전적으로 담당합니다. Bourne Again 쉘에서 이는 GNU readline 라이브러리입니다. Almquist 쉘은 libedit를 사용합니다. 다른 셸(예: Z Shell)에는 자체 라이브러리가 있습니다.
이러한 라이브러리는 터미널 에뮬레이터의 터미널 기능을 문서화하는 termcap/terminfo 라이브러리 위에 있습니다. 여기에는 커서를 상대적 또는 절대적 위치에 두는 제어 시퀀스, 줄 끝과 화면 끝을 지우는 시퀀스, 터미널에자동 여백.
이것과 터미널 너비에 대한 정보 TIOCGWINSZ
ioctl
(다른 라이브러리의 경우 termcap/terminfo 데이터베이스로 대체 COLUMNS
)를 사용하여 셸의 줄 편집 라이브러리는 명령줄 길이와 줄 수를 추적할 수 있습니다. 터미널 라인에 표시됩니다. 입력 라인을 편집하는 동안 커서를 지능적으로 이동하여 입력 라인을 다시 그립니다. 때로는 자동 마진에 의존할 수도 있습니다(단말기에 있는 경우). 때로는 제어 시퀀스를 사용하여 커서의 위치를 명시적으로 변경할 수도 있습니다.
그렇게 되면 다음과 같은 문제가 발생하게 됩니다.https://superuser.com/questions/695338/. 프롬프트 문자열의 제어 시퀀스가 올바르게 분리되지 않으면 사람들은 커서가 어디에 있는지, 화면의 특정 위치에 쓰려면 어떤 커서 움직임을 내보내야 하는지에 대해 혼란스러운 아이디어를 얻을 수 있습니다.
터미널 에뮬레이터는 명령줄이나 줄 편집 개념을 처리하지 않습니다. 이 레이어의 일부가 아닙니다. 간단한 문자 스트림과 제어 시퀀스를 확인하고 이를 렌더링해야 합니다. 터미널 에뮬레이터는 termcap/terminfo 항목에 광고된 제어 시퀀스를 구현하는 역할을 담당합니다. GNU readline, libedit, ZLE vim
등 screen
은 자신이 찾은 광고 콘텐츠를 사용합니다. 예를 들어 터미널에 자동 여백이 있다고 termcap/terminfo에서 선언하는 경우 에뮬레이터는 문자가 오른쪽 여백에 인쇄될 때 줄 바꿈해야 합니다. 터미널이 커서를 위아래로 움직일 수 있다고 명시한 경우 적절한 제어 시퀀스를 수신하면 실제로 그렇게 해야 합니다.
참고: GNU readline이 termcap/terminfo 항목에 그렇게 할 방법이 없다고 되어 커서를 위로 이동할 수 없다는 것을 발견하면 실제로 개행 문자가 전혀 표시되지 않습니다. readline은 입력 줄을 모두 한 줄에 수평으로 스크롤하는 모드로 돌아갑니다.
답변2
터미널 [에뮬레이터]가 이를 담당합니다. 다음 행의 첫 번째 열로 이동하는 것은 행의 마지막 위치를 채운 후 터미널이 수행하는 작업과 정확히 같습니다.
cat
긴 줄을 입력하고 입력하면 이것이 쉘이 수행하는 작업이 아니라는 것을 쉽게 알 수 있습니다. 쉘은 터미널에 있다고 생각 bash
되는 zsh
커서 위치와 열 수를 추적하고 줄 끝에서 다양한 터미널 제어 시퀀스를 출력하지만 이는 고급 줄 편집 기능 중 일부를 구현할 수 있도록 하기 위한 것입니다( 예를 들어 오른쪽 프롬프트, 가로 스크롤, 탭 완성 메뉴 표시 및 지우기, 현재 줄 다시 쓰기/새로 고침 등...) 그렇지 않으면 줄 바꿈이 계속 발생합니다.
tty 레이어는 화면 크기에 대해서도 알 수 있지만 줄바꿈이 발생하는지 확인하는 데는 사용되지 않습니다.
터미널이 이 작업을 수행하지 않으면 터미널에 버그가 있는 것입니다.