Frage Wie binde ich in bash eine Funktionstaste an einen Befehl?


Beispiel: Ich möchte das binden F12 Schlüssel zum Befehl echo "foobar" so, dass jedes Mal, wenn ich treffe F12 Die Nachricht "Foobar" wird auf dem Bildschirm ausgedruckt. Im Idealfall könnte es ein beliebiger Shell-Befehl sein, nicht nur eingebaute. Wie geht man das an?


78
2017-11-17 01:48


Ursprung


Antworten:


Sie können die von einem Schlüssel ausgegebene Zeichenfolge durch Drücken von bestimmen Strg-v in der Befehlszeile, dann drücken Sie die Taste, die Sie interessiert. Auf meinem System für F12, Ich bekomme ^[[24~. Das ^[ repräsentiert Esc. Verschiedene Arten von Terminals oder Terminalemulatoren können unterschiedliche Codes für den gleichen Schlüssel ausgeben.

Bei einer Bash-Eingabeaufforderung können Sie einen Befehl wie diesen eingeben, um das Schlüsselmakro zu aktivieren, damit Sie es ausprobieren können.

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

Jetzt, wenn Sie drücken F12, Sie erhalten "Foobar" in der Befehlszeile für die weitere Bearbeitung bereit. Wenn Sie einen Befehl wünschen, um sofort einen Befehl einzugeben, können Sie eine neue Zeile hinzufügen:

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

Jetzt, wenn Sie drücken F12, wird das aktuelle Verzeichnis angezeigt, ohne dass Sie drücken müssen Eingeben. Was ist, wenn Sie bereits etwas in die Leitung eingegeben haben und dieses automatisch ausführen? Es könnte unordentlich werden. Sie können die Zeile jedoch als Teil Ihres Makros löschen:

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

Der Raum sorgt dafür, dass das Strg-u hat etwas zu löschen, damit die Glocke nicht klingelt.

Sobald Sie das Makro so konfiguriert haben, wie Sie es möchten, können Sie es persistent machen, indem Sie es zu Ihrem hinzufügen ~/.inputrc Datei. Es gibt keine Notwendigkeit für die bind Befehl oder der äußere Satz von einfachen Anführungszeichen:

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

Bearbeiten:

Sie können auch eine Tastenbindung erstellen, die etwas ausführt, ohne die aktuelle Befehlszeile zu stören.

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

Wenn Sie beispielsweise einen Befehl eingeben, für den ein Benutzername erforderlich ist und Sie die Namen der angemeldeten Benutzer kennen müssen, können Sie drücken Alt-Verschiebung-W und die Ausgabe von who wird angezeigt und die Eingabeaufforderung wird mit intaktem Teilbefehl und Cursor an der gleichen Position in der Zeile erneut ausgegeben.

Leider funktioniert das nicht richtig für Tasten wie F12 welche mehr als zwei Zeichen ausgeben. In einigen Fällen kann dies umgangen werden.

Der Befehl (who in diesem Fall) könnte jede ausführbare Datei sein - ein Programm, ein Skript oder eine Funktion.


124
2017-11-17 03:42



Sie können Bash-Key-Bindungen in der .inputrc (Konfigurationsdatei für die GNU Readline-Bibliothek) definieren. Die Syntax ist

<Schlüsselsym- oder Schlüsselname>: Makro

beispielsweise:

Control-o: "> output"

erstellt ein Makro, das beim Drücken von "> Ausgabe" einfügt

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

erstellt ein Makro, das "Echo Foobar" einfügt, wenn Sie F1 drücken ... Ich weiß nicht, was das Tastenym für F11 aus der Hand ist.


12
2017-11-17 03:14



Diese Lösung ist spezifisch für X11-Umgebungen und hat nichts mit bash zu tun, sondern fügt Ihren .Xmodmaps Folgendes hinzu

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

sendet die Zeichenfolge "foobar" an das Terminal, wenn F12 gedrückt wird.


8
2017-11-17 01:59



Ich wollte binden Ctrl+B zu einem Befehl. Inspiriert von einer Antwort oben versuchte ich zu verwenden bindaber konnte nicht herausfinden, welche Serie kryptischer Squiggles (\e[24~ ?) übersetzen ins Ctrl+B.

Auf einem Mac, gehen Sie zu Einstellungen der Terminal-App, Profile -> Tastatur -> + dann drücken Sie die Tastenkombination, die Sie suchen und es kommt heraus. Für mich Ctrl+B führte zu \002 was ich erfolgreich befehligte

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

Wenn Sie möchten, dass der Befehl direkt ausgeführt wird (nicht nur in der Eingabeaufforderung), können Sie die Eingabe wie folgt am Ende des Befehls hinzufügen:

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


1
2017-07-20 09:55