Проблема с поведением кнопки Bash read backspace
При использовании чтения в bash нажатие клавиши "Backspace" не удаляет последний введенный символ, но, по-видимому, добавляет клавишу "Backspace" к входному буферу. Можно ли как-то изменить его, чтобы при удалении удалялся последний введенный ключ? Если так, как?
Вот краткий пример прога, с которым я пользуюсь, если это поможет:
#!/bin/bash
colour(){ #$1=text to colourise $2=colour id
printf "%s%s%s" $(tput setaf $2) "$1" $(tput sgr0)
}
game_over() { #$1=message $2=score
printf "\n%s\n%s\n" "$(colour "Game Over!" 1)" "$1"
printf "Your score: %s\n" "$(colour $2 3)"
exit 0
}
score=0
clear
while true; do
word=$(shuf -n1 /usr/share/dict/words) #random word from dictionary
word=${word,,} #to lower case
len=${#word}
let "timeout=(3+$len)/2"
printf "%s (time %s): " "$(colour $word 2)" "$(colour $timeout 3)"
read -t $timeout -n $len input #read input here
if [ $? -ne 0 ]; then
game_over "You did not answer in time" $score
elif [ "$input" != "$word" ]; then
game_over "You did not type the word correctly" $score;
fi
printf "\n"
let "score+=$timeout"
done
2 ответа
Решение
Опция -n nchars
переводит терминал в сырой режим, поэтому ваш лучший шанс - положиться на readline
(-е) [документы]:
$ read -n10 -e VAR
Кстати, хорошая идея, хотя я бы оставил конец слова пользователю (это реакция колена на нажатие возврата).
Я знаю, что пост старый, но это может кому-то пригодиться. Если вам нужен конкретный ответ на одно нажатие клавиши на клавишу возврата, что-то вроде этого может сделать это (без -e):
backspace=$(cat << eof
0000000 005177
0000002
eof
)
read -sn1 hit
[[ $(echo "$hit" | od) = "$backspace" ]] && echo -e "\nDo what you want\n"