나는 한 줄씩 읽고 터미널에 입력 한 줄을 다시 인쇄하는 매우 간단한 스크립트를 실행하고 있습니다.
while read CMD; do
echo $CMD
done
잘 작동하지만 backspace
문자로 줄을 편집하려고하면 문자 ^?
를 삭제하는 대신 인쇄 합니다. 그리고 Ctrl
+를 backspace
누르면 출력은 ^H
입니다. 이 동작을 어떻게 수정 backspace
하여 이러한 문자를 추가하는 대신 문자를 제거 할 수 있습니까? 나는 stty erase '^?'
명령을 시도 했지만 성공적으로하지 못했습니다.
답변
문제는 백 스페이스를 나타내는 여러 가지 방법이 있지만 read
명령이 이들을 모두 이해하지 못한다는 것입니다. ← Backspace터미널 에뮬레이터 설정에서 키를 누를 때 정확하게 전송되는 내용을 구성 할 수 있어야합니다 .
gnome-terminal
에뮬레이터로 사용한다고 가정 하고 편집 manu를 열고 프로파일 환경 설정을 클릭하십시오 . 호환성 탭으로 전환 하면 다음 옵션이 제공됩니다.
이제 백 스페이스 키 생성 : 설정을 변경할 수 있습니다 . 아래 5 가지 옵션 중에서 선택할 수 있습니다. 중괄호로 시스템에서 동작하는 방식을 추가했습니다.
- 자동 (작동)
- Control-H (
^H
대신 인쇄 ) - ASCII DEL (기본값, 작동)
- 이스케이프 시퀀스 (인쇄
^[[3~
대신) - TTY 지우기 (작동)
답변
Gnome-Terminal에서 bash를 사용하여 동일한 문제가 발생했습니다.
커맨드 라인에서 백 스페이스는 예상대로 작동하지만 내 프로그램 (간단한 TCP 소켓 기반 채팅 클라이언트)이 stdin에서 읽을 때 마지막 문자를 삭제하는 대신 backspace
문자가 인쇄됩니다 (화면으로 되돌아갑니다) ^?
.
사용 # stty icanon
「정규 (요리) 모드 “를 허용 할 수 있습니다. 여기 /unix/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminal에 대한 설명을 참조 하십시오
내 문제 / 해결책에 대한 배경 지식 : 4k 개 이상의 문자를 붙여 넣을 필요가 있습니다. 그리고 그 연구 동안, 나는 위의 링크로 연결되었습니다. # stty -icanon
4k 제한을 비활성화하는 데 사용 했지만 백 스페이스 (삭제) 기능을 사용할 수 없었습니다.