대화형으로 입력된 백스페이스는 언제 입력으로 전달됩니까?

대화형으로 입력된 백스페이스는 언제 입력으로 전달됩니까?

cat리디렉션을 통해 빠른 테스트 파일을 생성할 때(예: 샘플 입력 사용) 시스템마다 다른 동작이 나타나는 것을 방금 확인했습니다.

내가 말하는 내용을 이해하려면 다음 단계를 따르세요.

달리기 cat > testfile.

를 입력 helli하고 백스페이스를 누른 다음 를 입력합니다 o.

엔터 키를 치시오.

입력을 종료하려면 Ctrl-D를 입력하세요.

달리기 od -a testfile.

Mac과 같은 일부 시스템에서는 다음을 얻을 수 있습니다.

0000000    h   e   l   l   o  nl                                        
0000006

Windows에서 MobaXterm을 통해 로그인한 RHEL 5.7 호스트와 같은 다른 시스템에서는 다음을 얻을 수 있습니다.

0000000    h   e   l   l   i  bs   o  nl                                        
0000010

이 차이를 만드는 코드는 어디에 있습니까? 예를 들어 위의 예에서 MobaXterm이나 RHEL 5 시스템을 의심해야 합니까? 아니면 키보드와 파일 시스템 사이에 어떤 레이어가 있나요?


이것은 실제 질문이라기보다 호기심에 가까운 질문입니다. 분명히 텍스트 편집기를 사용하여 백스페이스 문자 없이 파일을 생성할 수 있었지만 과거에는 이것이 잘못되었습니다. 한번은 캐주얼한 데모/교육 중에 파일을 생성할 때 그런 문제가 있다고 언급했는데 cat, 백스페이스 문자는 문자 그대로 처리되어 결국 그런 효과가 없을 때만 오류를 표시했습니다.학생 Mac에서. 그래서 궁금하네요.

답변1

이는 a) BackSpace 키( ^H/ BS또는 ^?/ DEL)를 눌렀을 때 터미널 에뮬레이터가 전송하는 문자와 b) tty 드라이버가 사용하는 문자( VERASE후자를 변경하려면 --를 참조하고 사용)에 따라 달라집니다.stty(1)stty erase ^H

터미널 에뮬레이터가 전송 중이지만 ^Htty가 특수 문자로 인식하지 못하는 경우 BackSpace 키를 누르면 화면의 마지막 문자가 시각적으로 "삭제"되지만[1] 문자는 있는 그대로(문자와 함께) 전송됩니다. tty()에서 읽는 프로세스에 cat.

줄 편집 기능이 있는 편집기 및 대화형 프로그램은 tty를 원시 모드로 설정하고 특수 문자 자체를 처리하며 및 동일 하지 않은 ^H것으로 처리 할 수 있습니다. ;-)^?cat

echoctl stty[1] 이는 설정 에 따라 다릅니다 . 설정된 경우 터미널은 형식 "^"+chr(char^0x40)( ^Hfor BS = 8등)으로 제어 문자를 에코합니다.

답변2

cat쉘의 터미널 기능을 조작하는 명령을 사용하여 나타나는 동작을 재현할 수 있습니다 stty.

터미널이 표준 모드에 있으면 입력이 라인으로 수집되고 라인 편집이 활성화되며 선택적으로 stdin이 화면에 표시됩니다(IEXTEN 플래그).

비정규 모드에서는 일부 제어 문자가 셸에 전달됩니다.

예:

stty -icanon
cat > testfile # end with ctrl-c
#typed ls | space | backspace | ctrl-h | al | ctrl-d | ctrl-c
od -a testfile
0000000   l   s  sp del  bs   a   l  nl eot
0000011

표준 모드를 ​​복원하려면 다음을 수행하십시오.

stty icanon

현재 터미널 장치를 쿼리합니다.

stty
# OR for more info
stty -a
speed 9600 baud; rows 62; columns 255; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc

명령의 플래그 부분의 출력은 다음과 같습니다. 이전 표시 플래그가 설정되지 않았으므로 -표준 플래그에 대해 icanon설정 및 해제됩니다 .-icanon

매뉴얼 페이지에서:

선택 사항 - 부정을 나타내기 위해 앞에 SETTING이 옵니다. * POSIX가 아닌 설정을 표시합니다.

관련 정보