105 votes

En bash, comment lier une touche de fonction à une commande ?

Exemple : Je veux lier le F12 à la commande echo "foobar" de telle sorte qu'à chaque fois que je frappe F12 le message "foobar" sera imprimé à l'écran. Idéalement, il pourrait s'agir de n'importe quelle commande shell arbitraire, et pas seulement des buildins. Comment s'y prendre ?

186voto

Dennis Williamson Points 105818

Vous pouvez déterminer la séquence de caractères émise par une touche en appuyant sur Ctrl - v à la ligne de commande, puis en appuyant sur la touche qui vous intéresse. Sur mon système pour F12 j'obtiens ^[[24~ . Le site ^[ représente Esc . Différents types de terminaux ou d'émulateurs de terminaux peuvent émettre des codes différents pour la même touche.

À l'invite de Bash, vous pouvez entrer une commande comme celle-ci pour activer la macro de touches et l'essayer.

bind '"\e[24~":"foobar"'

Maintenant, quand vous appuyez sur F12 vous obtiendrez "foobar" sur la ligne de commande, prêt à être modifié. Si vous voulez qu'une touche entre immédiatement dans une commande, vous pouvez ajouter une nouvelle ligne :

bind '"\e[24~":"pwd\n"'

Maintenant, quand vous appuyez sur F12 vous obtiendrez l'affichage du répertoire actuel sans avoir à appuyer sur Enter . Et si vous avez déjà tapé quelque chose sur la ligne et que vous utilisez ce qui s'exécute automatiquement ? Cela peut devenir compliqué. Cependant, vous pouvez effacer la ligne dans le cadre de votre macro :

bind '"\e[24~":"\C-k \C-upwd\n"'

L'espace permet de s'assurer que le Ctrl - u a quelque chose à supprimer pour empêcher la cloche de sonner.

Une fois que la macro a fonctionné comme vous le souhaitez, vous pouvez la rendre persistante en l'ajoutant à votre fichier ~/inputrc fichier. Il n'y a pas besoin de l'option bind ou l'ensemble extérieur des guillemets simples :

"\e[24~":"\C-k \C-upwd\n"

Edit :

Vous pouvez également créer une liaison de touche qui exécutera quelque chose sans perturber la ligne de commande actuelle.

bind -x '"\eW":"who"'

Ensuite, pendant que vous tapez une commande qui nécessite un nom d'utilisateur, par exemple, et que vous avez besoin de connaître les noms des utilisateurs qui sont connectés, vous pouvez appuyer sur Alt - Shift - W et la sortie de who sera affiché et l'invite sera réémise avec votre commande partielle intacte et le curseur à la même position dans la ligne.

Malheureusement, cela ne fonctionne pas correctement pour des clés telles que F12 qui sortent plus de deux caractères. Dans certains cas, cela peut être contourné.

La commande ( who dans ce cas) pourrait être n'importe quel exécutable - un programme, script ou une fonction.

2 votes

Que faire si je veux ajouter une liaison à "ctrl+q" ?

5 votes

@kubudi : bind '"\C-q": menu-complete' par exemple (ou dans votre ~/.inputrc : "\C-q": menu-complete ). Vous pouvez également avoir besoin de stty -ixon dans votre ~/.bashrc pour désactiver le contrôle de flux et rendre ^S et ^Q disponibles.

0 votes

Vous dites que ^[ représente esc et ensuite vous semblez le substituer à \e dans votre exemple. Pouvez-vous expliquer pourquoi ?

19voto

Barton Chittenden Points 2070

Vous pouvez définir des liaisons de touches bash dans le fichier .inputrc (fichier de configuration de la bibliothèque GNU Readline). La syntaxe est la suivante

<clésym ou nom de la clé> : macro

par exemple :

Control-o: "> output"

créera une macro qui insère "> sortie" lorsque vous appuyez sur

 "\e[11~": "echo foobar"

créera une macro qui insère "echo foobar" lorsque vous appuyez sur F1... Je ne sais pas quelle est la combinaison de touches pour F11.

4 votes

Vous pouvez utiliser " \n "dans une macro, pour ajouter un caractère de nouvelle ligne :

0 votes

Cela fonctionne mieux pour moi car cela définit le mappage des touches à l'ouverture d'un terminal.

0 votes

Pour Alt utiliser \e par exemple "\eo": "> output" .

7voto

Wesley Rice Points 963

Cette solution est spécifique aux environnements X11 et n'a rien à voir avec bash, mais l'ajout de ce qui suit à votre .Xmodmaps

 % loadkeys
 keycode 88 = F12
 string F12 = "foobar"
 %

enverra la chaîne "foobar" au terminal en appuyant sur F12.

1 votes

Gardez à l'esprit que ce n'est pas la même chose que le shell qui exécute une commande. Si vous voulez réellement lancer une commande, vous devrez appuyer sur la touche Entrée (ou demander à la chaîne de caractères envoyée de le faire pour vous). Vous voudrez probablement aussi être sûr et effacer la ligne d'abord.

2 votes

Ce serait génial, mais cela ne semble pas fonctionner à partir de Fedora 20 de toute façon. J'ai même essayé d'utiliser xev pour trouver le bon code de touche pour F12 en premier (dans mon cas, 96) et de l'utiliser à la place de 88. Aucun des deux ne fonctionne.

3voto

Peter Perháč Points 8007

Je voulais lier Ctrl+B à une commande. Inspiré par une réponse ci-dessus, j'ai essayé d'utiliser bind mais ne pouvait pas comprendre quelle série de gribouillis cryptiques ( \e[24~ ?) se traduisent par Ctrl+B .

Sur un Mac, allez dans les paramètres de l'application Terminal, Profils -> Clavier -> + puis appuyez sur le raccourci clavier que vous recherchez et ça sort. Pour moi Ctrl+B a donné lieu à \002 que j'ai lié avec succès à la commande

bind '"\002":"echo command"'

De même, si vous souhaitez que la commande soit exécutée immédiatement (et non pas simplement insérée dans l'invite), vous pouvez ajouter la touche Entrée à la fin de votre commande, comme suit :

bind '"\002":"echo command\015"'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X