Comment définir la commande de lecture à exécuter sans avoir à appuyer sur le bouton Entrée dans le shell?

J’utilise le code ci-dessous pour atsortingbuer un caractère donné par l’utilisateur à la variable G:

read G 

Cependant, pour avancer dans l’exécution de mon script, je dois appuyer sur le bouton Entrée. Est-il possible de définir la commande read d’une manière ou d’une autre pour qu’elle affiche le processus à la ligne suivante immédiatement après avoir reçu la lettre de stdin?

Je pensais que dd pourrait être capable de le faire, alors je l’ai essayé et je n’ai rien trouvé. Cependant, Google a trouvé cela pour moi et je l’ai adapté ici:

 readOne () { local oldstty oldstty=$(stty -g) stty -icanon -echo min 1 time 0 dd bs=1 count=1 2>/dev/null stty "$oldstty" } 

Définissez cette fonction une fois au début de votre script, puis vous pourrez l’utiliser comme ceci:

 char=$(readOne) # get the character echo $char # print the character (or you can do something else with it) 

Si vous utilisez Bash:

 read -n1 G 

Votre système est configuré pour utiliser dash par défaut et dash ne prend pas en charge cette fonctionnalité. Vous devez donc également modifier la première ligne de votre script pour spécifier que vous souhaitez utiliser bash:

 #!/bin/bash