bash 스크립트를 실행하면 백 스페이스가 작동하지 않습니다. 스크립트를 실행하고 있습니다. while read CMD; do

나는 한 줄씩 읽고 터미널에 입력 한 줄을 다시 인쇄하는 매우 간단한 스크립트를 실행하고 있습니다.

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 -icanon4k 제한을 비활성화하는 데 사용 했지만 백 스페이스 (삭제) 기능을 사용할 수 없었습니다.