2010-11-16 6 views
7

Quando si utilizza read in bash, premere backspace non cancella l'ultimo carattere immesso, ma sembra aggiungere un backspace al buffer di input. C'è un modo in cui posso cambiarlo in modo che cancella rimuove l'ultima chiave digitato dall'input? Se é cosi, come?Bash read backspace button behavior problem

Ecco un breve prog esempio lo sto usando con se è di alcun aiuto:

#!/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 
+0

'se! leggi ... ' –

risposta

11

L'opzione -n nchars trasforma il terminale in modalità raw, quindi la tua migliore possibilità è affidarsi a readline (-e) [docs]:

$ read -n10 -e VAR 

BTW, bella idea, anche se vorrei lasciare la fine della parola per l'utente (si tratta di una reazione istintiva a premere ritorno).

+1

Tra tutti gli switch della manpage -e è l'unico che non ho provato o_O. Ad ogni modo, ha funzionato come voglio, con una stranezza: se premo cancella quando viene inserito un carattere, viene cancellata l'intera riga precedente. Sembra che aggiungere un ulteriore "-p" al comando sembrasse risolvere il problema. Saluti. –

+0

usa solo flag -e – danday74