Voici une variation de l'excellente idée de @SiegeX *
-solution d'impression pour bash
avec support pour le retour en arrière ajouté ; cela permet à l'utilisateur de corriger leur entrée avec le backspace
clé ( delete
sur un Mac) comme c'est généralement le cas avec les invites de mot de passe :
#!/usr/bin/env bash
password=''
while IFS= read -r -s -n1 char; do
[[ -z $char ]] && { printf '\n'; break; } # ENTER pressed; output \n and break.
if [[ $char == $'\x7f' ]]; then # backspace was pressed
# Remove last char from output variable.
[[ -n $password ]] && password=${password%?}
# Erase '*' to the left.
printf '\b \b'
else
# Add typed char to output variable.
password+=$char
# Print '*' in its stead.
printf '*'
fi
done
Note :
- Quant à savoir pourquoi le fait d'appuyer sur le retour arrière enregistre le code de caractère
0x7f
: "Dans les systèmes modernes, la touche d'effacement arrière est souvent mise en correspondance avec le caractère de suppression (0x7f en ASCII ou Unicode)." https://en.wikipedia.org/wiki/Backspace
-
\b \b
est nécessaire pour donner l'apparence de en supprimant le caractère à gauche ; en utilisant simplement \b
déplace le curseur vers la gauche, mais laisse le caractère intact ( non destructif retour en arrière). En imprimant un espace et en reculant à nouveau, le caractère semble avoir été effacé (merci, Le caractère d'échappement "backspace" ' \b ' en C, comportement inattendu ? ).
Dans un POSIX-only (par exemple, sh
sur Debian et Ubuntu, où sh
es dash
), utiliser le stty -echo
approche (ce qui est sous-optimal, car il imprime rien ), car le read
ne supportera pas l'option -s
y -n
options.