답변1
Bash는 터미널을 "원시" 모드로 변경했습니다. 이는 타자기 문자가 어떤 방식으로도 처리되지 않음을 의미합니다. Enter 키는 줄 바꿈(\n)이 아닌 캐리지 리턴(\r)을 생성하므로 변환이 발생하지 않습니다.
답변2
날것의그리고요리스키마는 설명적인 용어입니다. stty raw
bash와 다른 설정을 사용합니다.
터미널 초기화를 위한 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
(캐리지 리턴 및 줄 바꿈 번역 입력).