터미널에서 개행 문자를 자동으로 번역합니다.

터미널에서 개행 문자를 자동으로 번역합니다.

나는 팔로우한다여기.

나는 이 시점에서 다음과 같은 사실을 발견했습니다(완전하지는 않으며 단지 시연용임).

#include <termios.h>

  raw.c_iflag &= ~(ICRNL | IXON);
  raw.c_oflag &= ~(OPOST);
  raw.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG);

다음과 같이 만드세요:

printf("\n");

커서를 처음으로 이동하지 않고 다음 줄로 넘어갑니다. 텍스트에서는 \n일반적으로 번역되어 비활성화된다고 \r\n설명 합니다 OPOST.

관련하여 이 ICNRL플래그를 사용하면 ^M터미널이 캐리지 리턴(통과)을 올바르게 수신할 수 있습니다.

매뉴얼은 영감을 주지 않습니다:

OPOST는 구현 정의 출력 처리를 가능하게 합니다.

누군가 역사와 여기서 무슨 일이 일어나고 있는지 더 자세히 설명해 줄 수 있습니까?

그렇다면 파일의 16진 덤프를 가져올 때 어떻게 \n단일 바이트가 될 수 있습니까? "자동 번역"은 \r\n실제로 텍스트의 바이트를 대상으로 하는 것이 아니라 순전히 보기를 기반으로 수행됩니까?

답변1

이 질문에 대한 자세한 답변은 튜토리얼에서 확인할 수 있습니다.모든 출력 처리 끄기

터미널은 출력 측에서도 유사한 변환을 수행하는 것으로 나타났습니다. 이는 우리가 인쇄하는 모든 개행 문자("\n")를 개행 문자("\r\n")가 뒤에 오는 캐리지 리턴 문자로 변환합니다. 터미널에서 새 텍스트 줄을 시작하려면 이 두 문자가 필요합니다. 캐리지 리턴 문자는 커서를 현재 줄의 시작 부분으로 다시 이동시키고 줄 바꿈 문자는 커서를 한 줄 아래로 이동하여 필요한 경우 화면을 스크롤합니다. (이 두 가지 다른 작업은 타자기와 텔레타이프라이터 시대에 유래되었습니다.)

귀하의 질문에 직접 답변하려면,

그렇다면 파일의 16진수 덤프를 수행할 때 \n이 단일 바이트인 이유는 무엇입니까? \r\n에 대한 "자동 번역"은 실제로 텍스트의 바이트를 대상으로 하는 것이 아니라 뷰 기반으로만 수행됩니까?

예. 터미널로 전송되면 각 인스턴스는 \n터미널 회선 규칙에 따라 변환됩니다. \r\n이 플래그를 사용하여 사후 처리를 끌 수 있습니다 opost. 셸 수준에서는 다음을 통해 관리할 수 있습니다.stty

stty -opost    # Turn off "opost" processing
ls             # Notice you get a ladder effect due to there being no CR actions
stty opost     # Restore "opost" processing

시도해 볼 예정이라면 stty현재 상태를 저장하여 나중에 복원할 수 있다는 점을 알아 두는 것이 좋습니다.

g=$(stty -g)    # Save current state
stty raw        # Interesting times ahead
stty $g         # Follow this with « Ctrl j » rather than « Enter »

이것을 사용하면 bash명령줄 편집(GNU)을 제공하므로 예상대로 작동하지 않습니다 readline. 다른 셸(예: dash( )) 에 넣으면 sh실제 효과를 볼 수 있습니다.

관련 정보