^M과 \r이 일관되지 않게 동작하는 이유는 무엇입니까?

^M과 \r이 일관되지 않게 동작하는 이유는 무엇입니까?

어쩌면 내 질문에 간접적으로 대답하는 답변이 이미 있을 수도 있지만, 그 중 많은 답변을 읽었지만 아직 이 차이점에 대한 만족스러운 답변을 찾지 못했습니다.

캐리지 리턴의 원래 의미는 구식 텔레프린터에서 유래했습니다. 이는 프린트 헤드를 현재 줄의 왼쪽으로 이동하는 것을 의미했습니다. 현재 줄에 계속해서 쓰면 이미 쓴 내용을 덮어쓰게 됩니다. 오늘날 우리는 \r문자열에 명시적으로 입력되는 텍스트 기호를 사용하여 이 동작을 지정할 수 있습니다 . 예를 들어 Python에서는 을 실행할 수 print('hello\rgoodbye')있고 터미널에서는 을 실행할 수 echo $'hello\rgoodbye'있으며 두 경우 모두 만 표시됩니다 goodbye.

반대로 의사 캐리지 리턴은 ASCII 제어 문자 ^M( Ctrl-M또는 로 입력 )를 사용하여 Enter대화식으로 삽입 할 수도 있습니다. 캐리지 리턴으로 널리 알려져 있지만 놀랍게도 insert 가 아니라 새 줄의 기호인 \rinsert 이기 때문에 의사 캐리지 리턴이라고 부릅니다.\n

따라서 대화형 입력 hello, then Ctrl-M, then 은 goodbye놀랍게도 와 동등한 기능을 갖지 않지만 hello\rgoodbye과 동등한 기능을 갖습니다 hello\ngoodbye.

이것은 모순되지 않습니까? 이것의 근거는 무엇입니까?

답변1

이는 터미널 입력 처리의 결과입니다. 기본적으로 터미널 장치 드라이버(터미널 자체가 아닌 터미널의 입력을 처리하는 운영 체제 커널의 소프트웨어)는 다음을 CtrlM실행 CtrlJ하여 이를 확인할 수 있습니다.

od -t x1

그런 다음 두 문자를 입력합니다.

$ od -t x1
^M
^J
^D
0000000 0a 0a
0000002

^M( 화면에는 등이 표시 되지 않습니다 .)

따라서 를 입력할 때 CtrlM어떤 프로그램이 입력을 처리하는지에 관계없이 캐리지 리턴 문자가 아닌 줄바꿈 문자가 표시됩니다.

이는 구성될 수 있습니다 stty icrnl. 바라보다Return, Enter 및 stty icrlf에 대해 알아보기비슷한 질문에 대해서는.

관련 정보