![bash는 터미널이 개행(\n)을 캐리지 리턴(\r)으로 변환하도록 합니까?](https://rvso.com/image/111971/bash%EB%8A%94%20%ED%84%B0%EB%AF%B8%EB%84%90%EC%9D%B4%20%EA%B0%9C%ED%96%89(%5Cn)%EC%9D%84%20%EC%BA%90%EB%A6%AC%EC%A7%80%20%EB%A6%AC%ED%84%B4(%5Cr)%EC%9C%BC%EB%A1%9C%20%EB%B3%80%ED%99%98%ED%95%98%EB%8F%84%EB%A1%9D%20%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
답변1
Bash는 터미널을 "원시" 모드로 변경했습니다. 이는 입력 문자가 어떤 방식으로도 처리되지 않음을 의미합니다. Enter 키는 줄 바꿈(\n)이 아닌 캐리지 리턴 문자(\r)를 생성하므로 변환이 수행되지 않습니다.
답변2
날것의그리고요리모드는 설명적인 용어입니다. stty raw
bash와 다른 설정을 사용합니다.
Bash는 다음에서 터미널 초기화를 수행합니다.prepare_terminal_settings(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' && !reversed)) { /* 쿠킹 모드. */ 모드->c_iflag |= BRKINT | IGNPAR | ISTRIP | ICNL | 익손; 모드->c_oflag |= OPOST; 모드->c_lflag |= ISIG | 아이카논; #if VMIN == VEOF 모드->c_cc[VEOF] = CEOF; #endif #if VTIME == VEOL 모드->c_cc[VEOL] = CEOL; #endif } 또 다른 { /* 원시 모드. */ 모드->c_iflag = 0; 모드->c_oflag &= ~OPOST; 모드->c_lflag &= ~(ISIG | ICANON #ifdef XCASE | X케이스 #endif ); 모드->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
(캐리지 리턴을 개행 번역으로 입력).