다양한 수준의 복잡성으로 여러 답변을 읽었습니다. 대부분은 수동으로 입력하면 잘 작동합니다.
예를 들어:https://stackoverflow.com/a/20913871/1841533.
다음은 이 답변의 코드와 매우 유사한 샘플 코드입니다.
_delay_end_input_=2
printf "%s\n" "answer: "
IFS= read -d '' -n 1 theanswer
while IFS= read -d '' -n 1 -t ${_delay_end_input_} more ; do
theanswer="${theanswer}${more}"
done
이는 답변을 수동으로 입력할 때도 작동합니다. 즉, 문자별로...
하지만 한 줄(또는 여러 줄)을 붙여넣으면 다음과 같습니다.각 문자를 읽은 후 "남은 버퍼"를 표시합니다....디스플레이가 복잡해집니다.
화면에 정상적인 에코를 유지하면서 숨길 수 있는 방법을 찾지 못했습니다. (즉, 입력하거나 붙여넣은 경우에도 입력/붙여넣은 내용을 확인하고 싶습니다.)
간단한 예: 이것은 "abcd"를 한 글자씩 수동으로 입력할 때 나타나는 (좋은) 프롬프트입니다.
answer: abcd
그러나 순식간에 마우스로 "abcd"를 붙여 넣으면 각 문자를 읽은 후 남은 버퍼 전체를 반복적으로 읽어 에코가 엉망이 됩니다.
answer: abcdbcdcdd
TL/DR: 이 조각은 문자별로 입력할 때 잘 작동하지만 붙여넣은 항목의 각 문자를 읽은 후 나머지 읽기 버퍼를 에코합니다.
답변1
해결책을 찾았을 수도 있지만 누군가가 더 나은 것을 제공할 수 있기를 바랍니다.
수정된 코드: 일반적인 에코를 숨기고 읽을 때마다 스스로 에코했습니다.
stty_orig=`stty -g` ### added this
stty -echo ### added this
_delay_end_input_=2
printf "%s\n" "answer: "
IFS= read -d '' -n 1 theanswer
printf "$theanswer" >&2 ; ### added this
while IFS= read -d '' -n 1 -t ${_delay_end_input_} more ; do
printf "$more" >&2 ; ### added this
theanswer="${theanswer}${more}"
done
stty $stty_orig ### added this
지금까지는 필요한 모든 작업을 수행한 것 같습니다... 하지만 저는 이런 방식으로 stderr로 인쇄하는 것을 좋아하지 않습니다... (대신 /dev/tty로 printf하는 것이 더 나을까요?)
편집하다:ㅏ큰단점은: "백스페이스"나 삭제 처리가 어렵다: 1줄 이상의 텍스트를 입력하는 사람이 무엇인가를 바꾸고 싶을 때 수정 키를 해석하기가 매우 어렵다... 1줄 이상의 텍스트 입력을 허용함으로써 readline이 여기서는 최고일 것입니다... (아마도 Perl이 하나 갖고 있을까요?)