기다리지 않고 터미널에서 읽기 [ENTER]

기다리지 않고 터미널에서 읽기 [ENTER]

이런 어리석은 질문으로 귀찮게 해서 미안하지만 최근에 Linux 터미널을 사용하기 시작했고 이 명령에 관한 논문을 읽었을 때 stty다음과 같은 문제를 발견했습니다.

¿ 에코를 변경하고 기다리지 않고 읽을 수 있는 방법은 무엇입니까 ENTER("0"에서 "f"까지의 16진수만 입력하면 됩니다)?

나는 첫 번째 부분 stty -echostty echo.

하지만 기다리지 않고 터미널에서 읽는 방법을 모르겠습니다 ENTER. 두 번째 항목을 검색 했지만 명령에서 이를 달성하기 위한 설정을 man찾을 수 없습니다 .stty

간단해야 한다는 것을 알고 있지만 입력 16진수를 추가하는 솔루션이나 논리를 찾을 수 없습니다.

답변1

read -- shell 내장 명령을 참조하는 경우 ENTER를 기다리는 대신 N 문자를 읽은 후 반환하는 옵션이 있습니다. 노력하다:

read -n1 ; echo You entered $REPLY

반품,read --help

답변2

눌러야 하는 이유 Enter는 터미널 장치 드라이버( /dev/tty*또는 /dev/pt*상호 작용하는 키보드와 모니터가 있는 물리적 장치가 아닌 장치 뒤에 있는 커널 코드)가 기본 줄 편집기를 구현하기 때문입니다.

예를 들어, 애플리케이션이 read()열려 있는 파일 설명자에 대해 시스템 호출을 수행할 때 Enter 키를 누르면(그리고 CR을 사용하면 키를 누를 때 터미널에서 보낸 문자가 LF로 변환됩니다)./dev/pts/0read()BackspaceCtrl+UCtrl+WEnter

라인 편집기를 비활성화하려면 장치 드라이버에 특정 제어 명령을 실행해야 합니다. 여기서 stty명령이 실행됩니다.

를 사용하면 stty -icanon줄 편집기가 비활성화됩니다( stty cbreak일부 시스템에서는 이를 필요로 하며 stty cbreak대안으로 지원되는 경우가 많습니다).

이 모드가 아닌 경우 icanon일부 추가 매개변수를 사용하여 사용자 정의합니다.직접모델:

  • ^C, ^Z여전히 인터럽트/중단이 발생합니다. stty -isig읽기 애플리케이션에 있는 그대로 전달되도록 비활성화 해야 합니다 .
  • ^Q, ^S여전히 흐름 제어에 사용됩니다( stty -ixon비활성화).
  • CR여전히 으로 변환되므로 비활성화 LF해야 합니다 .stty -icrnl

stty raw이 모든 기능과 일부 기능을 비활성화하는 바로가기입니다.산출핸들링도 마찬가지다. 게다가 하나를 추가하면 -echo장치 /dev/pts/1는 터미널과 상호 작용하는 애플리케이션 간의 일반 패스처럼 작동합니다.

그래서:

saved_settings=$(stty -g)
stty raw -echo
byte=$(dd bs=1 count=1 2> /dev/null)
stty "$saved_settings"

하나는 준비될 거야바이트(특정 키를 눌렀을 때 터미널이 보낼 수 있는 문자 시퀀스는 말할 것도 없고 문자가 아님) 일단 터미널에서 전송되면 터미널 장치에서 보냅니다.

ksh를 제외하고( viksh가 자체 라인 편집기를 구현하는 // 옵션이 있는 경우, bash에서 이에 상응하는 항목 참조) emacs내장 기능은 기본적으로 터미널 장치 설정을 변경하지 않으므로 여전히 입력을 기다려야 합니다. 모든 콘텐츠의 단말 장치에서.gmacsvaredzshread -ereadEnter

그러나 readzsh의 내장 기능( -k또는 -q옵션 포함)과 ksh93, bash 또는 mksh의 내장 기능( -n또는 -N옵션 포함)은 이 icanon모드를 비활성화하여 입력을 받을 때 한 번의 키 누르기로 돌아갈 수 있도록 합니다. 터미널 장치( isig비활성화되지는 않았으므로 스크립트를 계속 중단할 수 있습니다( Ctrl+C예:).

관련 정보