Bash에서 1줄 이상 읽기 - 붙여넣을 때 작동하도록 설정(수동 입력 외에도)

Bash에서 1줄 이상 읽기 - 붙여넣을 때 작동하도록 설정(수동 입력 외에도)

다양한 수준의 복잡성으로 여러 답변을 읽었습니다. 대부분은 수동으로 입력하면 잘 작동합니다.

예를 들어: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이 하나 갖고 있을까요?)

관련 정보