Я прочитал несколько ответов с разной степенью сложности. Большинство из них работают хорошо, когда вводятся вручную.
Например: 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: фрагмент отлично работает при вводе символа за символом, но отображает оставшийся буфер чтения после чтения каждого символа вставленной записи.
Возможно, я нашел обходной путь ... Но я также надеюсь, что кто-то выдаст что-нибудь получше.
Исправленный код: я скрываю нормальное эхо, и я повторяю его сам после каждого чтения:
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?)
edit : большой недостаток: трудно также обрабатывать "backspaces" или dels: если человек вводит 1 или несколько строк текста хочет что-то изменить, довольно сложно интерпретировать корректирующие ключи ... Лучше всего иметь строку чтения, разрешающую 1 или несколько строк ввода ... (может быть, в Perl она есть?)