Je bosse actuellement sur un petit script et je souhaite intégrer un système de logs/historiques des commandes entrés et cela implique de gérer la détection des appuies sur les flèches directionnelles. J'ai pas mal cherché, j'ai trouvé des choses qui fonctionnent mais que je ne parviens pas à implémenter dans mon code. (en gros j'appuie sur flèches haut pour rebalancer ma commande précédente comme dans le shell de base.)
Mon code ressemble à ça :
read cmd
while [ $cmd != "exit" ]
do
case $cmd in
"cas 1" ) ma_fonction ;;
"cas 2" ) mon_autre_fonction ;;
...
esac
read cmd
done
Un script que j'ai trouvé et qui fonctionne m'indique ceci :
while true
do
read -sn1 a
echo $a
test "$a" == `echo -en "\e"` || continue
read -sn1 a
test "$a" == "[" || continue
read -sn1 a
case "$a" in
A) echo "haut";;
B) echo "bas";;
C) echo "droite";;
D) echo "gauche";;
esac
done
Sauf que malgré divers bidouillages depuis ce matin je ne parviens pas à implémenter ma fonctionnalité en partant de ce script.
J'espère avoir été clair et je vous remercie par avance de votre aide et de vos conseils ! ^_^
malheureusement avec ta solution on reste sur le même problème ; à savoir comment je peux implémenter ce cas avec la gestion des autres cas ? Car là par exemple je peux pas géré à la fois les flèches et une entrée de type "ma_commande -args"
Le but est d'avoir un sorte de second shell, je tape donc mes commandes etc... et le but est que dès que j'appuie sur une flèche (haut par exemple) je puisse naviguer dansl l'historique de mes commandes (haut = avoir la commande précédente) enfin exactement pareil que l'historique du shell
je n'ai jamais eu à faire ça; je ne sais pas comment faire.
en général, on se contente simplement d'un menu qui affiche les commandes disponibles, on tape un nombre correspondant à la commande qu'on veut exécuter, etc.
tu as des fonctions différentes pour exécuter une même commande avec des options différentes ? ça va à l'encontre de ce à quoi servent les fonctions : exécuter un code similaire avec des paramètres différents !
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Je voit, pas de soucis, j'ai trouvé aucune info dessus donc ca doit pas être si facile à faire malheureusement...
Ca serait plus simple le menu mais non conforme à notre cahier des charges; l'idée c'est vraiment de créé un script qui se créé un "nouveau shell" dédié à certaines tâches
Non c'est des arguments car derrière c'est pas les mêmes actions (par exemple host -a c'est de l'ajout, host -r de la suppression, host -l de la modification) et vu qu'on est plusieurs à taffer sur le projet c'était plus simple de découper par petit bout donc fonction différente plutôt qu'un gros host qui gére l'argument ajout/suppression/modification puis les arguments suivant etc... (mieux vaut 3 "petites" fonctions qu'une grosse qui s'étalle sur plus de 100 lignes)
Je n'avais pas vu les choses de cette façons ni étudier cette manière de le faire, le bash est tout nouveau et j'avoue avoir plus visé la facilité "syntaxique" (car avouons le, elle n'est pas facilement abordable) je tenterais de refaire tout ça proprement avec tes conseils si le temps le permet et surtout d'en tenir compte pour des scripts futur. Merci de tes conseils !
Pour faire de l'interaction, il faut manipuler chaque caractère 1 par 1.
Lire un caractère avec read -sN1 k
Si c'est un échap \e, alors lire tout ce qu'il reste while read -t0 ; do read -N1 k ; echo $k ; done
Sinon c'est un caractère classique qu'on peut ajouter à buffer de la ligne actuelle.
Dès qu'il y a le caractère saut de ligne \n, on peut considérer le buffer comme remplit et continuer le reste du script
Après, il y existe des commandes comme rlwrap qui font de l’interaction, de la complétion et de l'historique. Ce serait plus simple de lancer ton programme avec rlwrap.
J'avais fait une solution similaire à ce que tu dit, ça marchais assez bien mais je trouvais que le coté "bricolage" un peu dérangeant et complexe je vais donc peut être revenir sur cette solution et tâcher de rendre ça plus propre.
Je vais également regarder du coté de rlwrap, merci !
---- Update 19/04/19 16h40
read -sn1 k
if [ "$k" = `echo -en "\e"` ]
then
while read -t0 ; do read -N1 k ; done
case ${k} in A) echo haut;; B) echo Bas;; C) echo Droite;; D) echo Gauche;; esac
else
read -p "$k" cmd
cmd=`echo -n "$k$cmd"`
echo "$cmd"
fi
Alors ce petit bout permet de gérer les flèches ainsi que les commandes, seul point "tatillon" ; admettons je tape "coucou" et je voulais écrire "bonjour" je pourrais pas supprimer et remplacer le premier c tant sur l'affichage que dans la variable
Je pense je vais me contenter de ça, l'utilisateur ne se trompera pas xD
Merci à tous pour vos propositions
- Edité par D@mien10 19 avril 2019 à 16:40:34
[Bash] Détecter appuie flèches directionnelles
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique