이런 어리석은 질문으로 귀찮게 해서 미안하지만 최근에 Linux 터미널을 사용하기 시작했고 이 명령에 관한 논문을 읽었을 때 stty
다음과 같은 문제를 발견했습니다.
¿ 에코를 변경하고 기다리지 않고 읽을 수 있는 방법은 무엇입니까 ENTER("0"에서 "f"까지의 16진수만 입력하면 됩니다)?
나는 첫 번째 부분 stty -echo
과 stty 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/0
read()
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를 제외하고( vi
ksh가 자체 라인 편집기를 구현하는 // 옵션이 있는 경우, bash에서 이에 상응하는 항목 참조) emacs
내장 기능은 기본적으로 터미널 장치 설정을 변경하지 않으므로 여전히 입력을 기다려야 합니다. 모든 콘텐츠의 단말 장치에서.gmacs
vared
zsh
read -e
read
Enter
그러나 read
zsh의 내장 기능( -k
또는 -q
옵션 포함)과 ksh93, bash 또는 mksh의 내장 기능( -n
또는 -N
옵션 포함)은 이 icanon
모드를 비활성화하여 입력을 받을 때 한 번의 키 누르기로 돌아갈 수 있도록 합니다. 터미널 장치( isig
비활성화되지는 않았으므로 스크립트를 계속 중단할 수 있습니다( Ctrl+C예:).