bash를 사용하면 터미널이 줄 바꿈(\n)을 캐리지 리턴(\r)으로 변환합니까?

bash를 사용하면 터미널이 줄 바꿈(\n)을 캐리지 리턴(\r)으로 변환합니까?

두 개의 터미널을 열고 cat위 터미널에서 읽기 위해 아래 터미널에서 실행했습니다.

여기에 이미지 설명을 입력하세요.

위의 터미널에 를 입력했는데 위의 터미널이 키를 캐리지 리턴( )으로 보내는 "Hello World<Enter>Bye"것처럼 보입니다 .Enter\r

그렇다면 라인 피드( )를 캐리지 리턴( ) 으로 bash변환하도록 터미널 설정을 변경하는 것은 어떻습니까 ?\n\r

답변1

Bash는 터미널을 "원시" 모드로 변경했습니다. 이는 타자기 문자가 어떤 방식으로도 처리되지 않음을 의미합니다. Enter 키는 줄 바꿈(\n)이 아닌 캐리지 리턴(\r)을 생성하므로 변환이 발생하지 않습니다.

답변2

날것의그리고요리스키마는 설명적인 용어입니다. stty rawbash와 다른 설정을 사용합니다.

터미널 초기화를 위한 Bash단말기 설정 준비(readline 라이브러리의 내부 함수), 에코 없이 한 번에 한 문자씩 읽을 수 있도록 터미널 모드를 설정합니다.

  tiop->c_lflag &= ~(ICANON | ECHO);

그러나 캐리지 리턴 변환은 다음으로 재설정됩니다.함수의 다른 부분:

  /* Make sure we differentiate between CR and NL on input. */
  tiop->c_iflag &= ~(ICRNL | INLCR);

prepare_terminal_settings비교 한다면핵심 도구stty, 후자가 더 적은 작업을 수행합니다(몇 가지 포인트가 있지만 bash INLCR도 재설정됨).

      else if (STREQ (정보->이름, "원시") || STREQ (정보->이름, "요리됨"))
        {
          if ((정보->이름[0] == 'r' && 역방향)
              || (정보->이름[0] == 'c' && ! 역))
            {
              /* 쿠킹 모드. */
              모드->c_iflag |= IGNPAR IXON |
              모드->c_oflag |= OPOST;
              모드->c_lflag |= ISIG |Ikanon;
#VMIN == VEOF인 경우
              모드->c_cc[VEOF] = CEOF;
#만약을 대비해
#VTIME == VEOL인 경우
              모드->c_cc[VEOL] = CEOL;
#만약을 대비해
            }
          기타
            {
              /* 원본 모드. */
              모드->c_iflag = 0;
              모드->c_oflag &= ~OPOST;
              모드->c_lflag &= ~(ISIG | ICANON
#ifdef XCASE
                                 |XCASE
#만약을 대비해
                );
              모드->c_cc[VMIN] = 1;
              모드->c_cc[VTIME] = 0;
            }
        }

POSIX 라고stty raw:

원시 입력 및 출력을 활성화(비활성화)합니다. 원시 모드는 다음 설정과 동일해야 합니다.

stty cs8 erase ^- kill ^- intr ^- \
    quit ^- eof ^- eol ^- -post -inpck

-post흥미롭게도( 및 에서 설명한 대로 -inpck) 입력 시 캐리지 리턴 변환 문제를 해결하지 못합니다.

조건 때문에날것의그리고요리(POSIX 또는 coreutils stty)는 bash의 기능과 일치하지 않습니다. 실제 기능에 해당하는 POSIX termios 기능을 언급하는 것이 좋습니다.icrnl(캐리지 리턴 및 줄 바꿈 번역 입력).

관련 정보