명령의 타이프 스크립트 script
(예: 저장된 파일)에서 개행 문자는 CR + LF(\r\n)이지만 원래 개행 문자( 에 입력됨 script
)는 LF입니다. 왜? 이것은 tty 문제인 것 같습니다. 잘 모르겠습니다. 자세히 설명하지 않고 이것을 설명할 수 있는 사람이 있나요?
나는 아무런 문제가 없었습니다. 단지 궁금했습니다. :) (하지만 고치는 것이 더 낫다고 생각합니다. 아니면 적어도 문서화해야 합니다.)
내 것은 script
util-linux에서 왔지만 아마도 그다지 중요하지 않을 것입니다.
답변1
프로그램 출력과 캡처된 tty 스트림(예 : ) typescript
간의 차이에 대한 근본적인 이유 는 tty가인쇄기.
유닉스 이전에는 텍스트가 줄 끝 부분에 항상 CRLF를 가지고 있었는데, 이는 줄 끝의 논리적 표현으로 간주되었기 때문이 아니라 각 문자가 실제 물리적 의미를 갖고 있었기 때문입니다. 즉, 프린트 헤드를 왼쪽으로 끝까지 이동하고 종이를 전진시키기 위해.
Unix는 완전히 새로운 접근 방식을 취합니다. 디스크의 텍스트 파일을 프린터에 대한 명령이 아닌 그 자체로 유용한 개체로 처리하고 행을 논리적 개체로 처리합니다. UNIX 세계관에서 두 문자 줄 종결자는 불필요하게 복잡합니다.
그러나 그들은 단일 "줄 끝" 문자를 인식하지 못하고 CR로 작업의 절반만 수행하고 LF로 나머지 절반만 수행할 수 있는 프린터와 CRT 멍청한 터미널과 같은 기존 하드웨어를 사용해야 했습니다. 따라서 변환은 하드웨어에 가장 가까운(tty 드라이버에서) 수행되어야 합니다.
그때부터 모든 것이 이전 버전과 호환됩니다. 따라서 CRLF 사용을 요구하는 터미널 에뮬레이터와 프로그램이 출력할 때 개행 문자를 제공하는 tty 드라이버가 있습니다.
답변2
출력은 typescript
pty로 전송된 모든 문자를 캡처합니다. 예를 들어 개행 문자가 일반적으로 CR+LF로 변경되는 것을 방지하는 터미널 드라이버를 사용하는 경우 stty -opost
출력에는 LF 문자만 표시됩니다.
이것이 도움이 되기를 바랍니다.
col -b < typescript
처음으로 파일을 정리합니다.
답변3
공부하고 나서 나만의 대답답변그리고 댓글 작성자이카루스:
"파일의 개행"과 "콘솔의 개행"을 구별해야 합니다. 콘솔에서 반직관적으로 실제 개행 문자는 아래와 같이 CRLF입니다.
UNIX 규칙에서 LF는 텍스트 파일의 개행 문자를 나타내고, 그 반대로 LF는 개행 문자를 나타냅니다. ("당신 말은"은 자연어 텍스트를 의미합니다.) DOS CR+LF 등에서 좋아요 모두가 알고 있습니다.
(Unix) 콘솔은 더 복잡합니다. 먼저 LF와 CR은 제어코드라는 점을 기억하셔야 합니다.제어굵게, 색상 등을 제어합니다.
콘솔에 LF(\n, 개행 문자)를 입력하면 개행 문자가 표시됩니다. 문제는, 글쎄,둘문제는 다음과 같습니다. (1) 콘솔은 2계층으로 구성되어 있습니다. 말하자면 필터 부분과 렌더링 부분으로 구성되어 있습니다. (임시 명명법.) 숨겨진(일반 사용자에게) 필터는 LF를 CRLF로 변환합니다. (2) 렌더러에서는 일반 줄 바꿈 문자로 CRLF(\r\n)가 필요합니다. 자세한 내용은 아래를 참조하세요.
이 명령으로 생성된 타이프스크립트 파일은 script (1)
문자를 기록합니다.뒤쪽에콘솔 입력이 필터링됩니다. 이것이 TypeScript의 개행 문자가 CRLF인 이유입니다.
세부정보 및 기타. 사실:
- 콘솔 렌더러는 LF를 "커서를 한 줄 아래로 이동"으로 인쇄하고 CR을 "커서를 줄의 시작 부분으로 이동"으로 인쇄합니다.
- LF->CRLF 변환을 끄고
$ stty -opost
이를 지워서 이를 수행할 수 있습니다$ stty opost
. "opost"는 "output post-processing"의 약어입니다.- 보다 정확하게는
opost
설정 시 LF->LFCR이 변경됩니다. 설정onlcr
하면onocr
줄 시작 부분 등에서 CR이 제거됩니다. 참조: POSIX 11장"범용 터미널 인터페이스".
- 보다 정확하게는
- Unix에서 "Enter" 키는 키 매핑 용어로 "Return"으로 알려진 LF에 바인딩되어 있습니다. (바라보다이 문제더 알아보기. )
- 이스케이프 코드 변형도 있습니다.
man 4 console_codes
"ESC D"(\eD)는 개행 문자이고 "ESC E"(\eE)는 개행 문자라고 설명되어 있습니다. 인쇄하면 "ESC D"는 ±opost-ness에 관계없이 "커서 아래로 이동"이고 "ESC E"는 CR+LF입니다.
몇 가지 실험을 수행하려면 별도의 콘솔에서 작성하는 것이 좋습니다. 예를 들어, $ echo -ne '1st\n2nd\r\n3rd\n" > /dev/tty1
첫 번째 비X 콘솔에 쓰고 /dev/pts/0
첫 번째 X 터미널이 됩니다. 이것은 가장 편리한 방법은 아니지만 가장 모호하지 않습니다.