script shell répondre à la pression de touche
J'ai un script shell qui en substance dit quelque chose comme
while true; do
read -r input
if ["$input" = "a"]; then
echo "hello world"
fi
done
C'est bien, et bon, mais je viens de réaliser que d'avoir à taper ENTRÉE présente un grave problème dans cette situation. Ce dont j'ai besoin est pour le script de répondre lorsque vous appuyez sur une touche, sans avoir à appuyer sur entrée.
Est-il un moyen de parvenir à cette fonction dans un script shell?
Dans le cas où c'est votre vrai code, notez que vous avez manqué espaces autour
nah ce n'est pas mon vrai code. mais merci pour l'astuce
L'application pour que le script est dans un affichage. l'ancien panneau de contrôle a été faite à l'aide d'une souris, et clique sur le mécanisme de fonctionnement. Mais ils veulent ajouter un coin-op pour le stockage de données. L'ordinateur d'origine est mort, et a été en cours d'exécution de windows 98, et aucun matériel ou logiciel fonctionne sur un nouveau système d'exploitation windows. Donc j'en déduit les opérations individuelles, et re-branché un clavier pour servir les IO de la fonctionnalité. mais quand je venu à la maison pour écrire le reste du script, une connexion à distance, il semblait ne pas fonctionner. L'affichage public: les enfants. Il existe un risque substantiel de hasard IO
double possible de Comment puis-je l'invite pour l'entrée dans un Linux shell script?
touches spéciales sous-ensemble: stackoverflow.com/questions/22842896/...
[
et ]
dans le if
condition.nah ce n'est pas mon vrai code. mais merci pour l'astuce
L'application pour que le script est dans un affichage. l'ancien panneau de contrôle a été faite à l'aide d'une souris, et clique sur le mécanisme de fonctionnement. Mais ils veulent ajouter un coin-op pour le stockage de données. L'ordinateur d'origine est mort, et a été en cours d'exécution de windows 98, et aucun matériel ou logiciel fonctionne sur un nouveau système d'exploitation windows. Donc j'en déduit les opérations individuelles, et re-branché un clavier pour servir les IO de la fonctionnalité. mais quand je venu à la maison pour écrire le reste du script, une connexion à distance, il semblait ne pas fonctionner. L'affichage public: les enfants. Il existe un risque substantiel de hasard IO
double possible de Comment puis-je l'invite pour l'entrée dans un Linux shell script?
touches spéciales sous-ensemble: stackoverflow.com/questions/22842896/...
OriginalL'auteur j0h | 2014-06-03
Vous devez vous connecter pour publier un commentaire.
N'attendent qu'une lettre (et ne pas attendre pour la présentation) et le silence (ne pas écrire la lettre).
De travail pour moi.
Voulez-vous continuer dans la boucle comme ceci bloquer jusqu'à ce que quelque chose est entrée ?
Je le veux pour demander à l'utilisateur: pourquoi ils veulent le faire, après chaque étape. malheureusement, je suis encore à la maison, sur un ordinateur windows.
Si vous avez besoin de vérifier si l'entrée est disponible, essayez d'ajouter
-t 0.01
attendre une fraction de seconde, puis si aucune touche n'est en attente. Un plus petit nombre encore sont probablement tout à fait correct si vous voulez vraiment une boucle serrée. Informel expérimentation suggère de 0,00001 fonctionne mais 0.000001 est trop petit.OriginalL'auteur pacholik
de sorte que le travail final extrait est le suivant:
OriginalL'auteur Donald Derek
Une autre manière de faire, dans un non bloquant chemin(pas sûr si son ce que vous voulez). Vous pouvez utiliser stty pour définir le min temps de lecture à 0.(peu dangereux si stty sane n'est pas utilisé après)
Alors il suffit d'exécuter la boucle comme d'habitude. Pas besoin de r.
IMPORTANT!
Après vous avez terminé avec le non blocage, vous devez n'oubliez pas de régler stty de retour à la normale à l'aide de
Si vous n'avez pas, vous ne serez pas en mesure de voir quoi que ce soit sur le terminal et il va se bloquer.
Vous voudrez probablement les suivants un piège pour ctrl-C comme si le script, c'est d'arrêter avant de revenir stty de retour à la normale, vous ne serez pas en mesure de voir ce que vous tapez et il apparaît que le terminal est bloqué.
P. S Aussi, vous voulez peut-être placer une instruction de mise en veille dans votre script de sorte que vous ne pas utiliser tout votre CPU que ce sera juste en continu courir aussi vite qu'il le peut.
P. S. S, Il semble que la pendaison problème était que lorsque j'avais utilisé de l'écho que j'ai utilisé pour donc est probablement pas nécessaire. Im va le laisser dans la réponse même si, comme il est toujours bon pour réinitialiser stty par défaut pour éviter des problèmes futurs.
Vous pouvez utiliser de l'écho si vous ne voulez pas ce que vous avez tapé à apparaître à l'écran.
OriginalL'auteur
Vous pouvez utiliser cette
getkey
fonction:Il permet de désactiver temporairement "canonique" dans les paramètres du terminal
(
stty -icanon
), puis retourne à l'entrée de la "tête" (un shell intégré) avec l'-c1 option qui est de retour d'UN octet de l'entrée standard. Si vous n'incluez pas le "stty -icanon" alors, le script fait écho à la lettre de la touche enfoncée, puis attend pour le RETOUR (pas ce que nous voulons). Les deux "tête" et "stty" sont shell de commandes intégrées. Il est important de sauvegarder et de restaurer les anciens paramètres du terminal après la presse est reçu.Puis getkey() peut être utilisé en combinaison avec un "
case /esac
" déclaration interactif sur une touche de sélection à partir d'une liste d'entrées:exemple:
Ce
getkey()/case-esac
combinaison peut être utilisé pour faire de nombreux scripts shell interactif. J'espère que cette aide.OriginalL'auteur Ian Forsyth
J'ai un moyen de le faire dans mon projet: https://sourceforge.net/p/playshell/code/ci/master/tree/source/keys.sh
Il lit une touche unique à chaque fois key_readonce est appelé. Pour les touches spéciales, une spéciale d'analyse en boucle à être en mesure d'analyser.
C'est la partie cruciale de:
OriginalL'auteur konsolebox