입력 된 백 스페이스를 처리하는 ^?
방법 read
은 12^?3
이미 5자가 완료되었지만 (모두 실제 입력이 아니 었음에도 불구 하고) 문자 수를 계산하는 방법을 보여 주지만 12^?3^?
프롬프트가 반환 된 후 이상합니다. 도와주세요!
-bash-3.2$ read -n 5
12^?3^?-bash-3.2$
답변
일반 read
(또는 read -r
이 동작에 영향을 미치지 않는 다른 옵션) 으로 전체 행을 읽을 때 커널 제공 행 편집기는 Backspace한 문자를 지우는 키와 다른 명령 ( Return입력 완료 포함) 을 인식합니다. 줄을 보내십시오). 유틸리티를 사용하여 바로 가기 키를 구성 할 수 있습니다 stty
. 터미널은 라인 편집기가 활성화 될 때 쿠킹 모드에 있다고합니다. 원시 모드에서는 키보드에 입력 된 각 문자가 즉시 응용 프로그램으로 전송됩니다. 쿠킹 모드에서는 문자가 버퍼에 저장되고 완전한 행만 응용 프로그램으로 전송됩니다.
구현하기 위해 고정 된 수의 문자 이후에 읽기를 중지하려면 read -n
bash가 원시 모드로 전환해야합니다. 원시 모드에서 터미널은 Backspace키 처리를 수행하지 않으며 (를 누를 Backspace때까지 앞의 문자가 이미 bash로 전송되었습니다) bash는 처리를 수행하지 않습니다 (아마도 유연성이 뛰어납니다) 스크립트가 자체 처리를 수행하도록 허용).
-e
bash 자신의 라인 편집기 (readline, 커널의 매우 거친 라인이 아닌 적절한 라인 편집기)를 활성화 하는 옵션 을 전달할 수 있습니다 . bash는 line edition을 수행하므로 요청 된 문자 수가 있으면 읽기를 중지 할 수 있습니다.
답변
사용 read -e
:
$ read -e -n 5
13acX
read -e
다음을 의미합니다.
그렇게하면 백 스페이스 등을 포함하여 일반 쉘 프롬프트에서 쓸 때와 같은 방식으로 입력을 편집 할 수 있습니다 Home.
답변
read
bash 내장입니다. (참조 type read
.) 당신이 문서를 찾을 수 있습니다 man bash
:
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
[...]
-e If the standard input is coming from a terminal, readline (see READLINE above) is used to obtain the line.
Readline uses the current (or default, if line editing was not previously active) editing settings.
또는 당신은 사용할 수 있습니다 help read
:
read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
-e use Readline to obtain the line in an interactive shell
이 -e
스위치는 기본적으로 백 스페이스 처리를 포함하여 쉘 프롬프트에서 사용 가능한 모든 기능을 허용하는 리드 라인 지원을 활성화합니다.
그러므로 read -en 5
원하는 것을해야합니다.