Ich habe ein Dienstprogramm in bash geschrieben, mit read -e
dem eine Eingabeaufforderung für SQL-ähnliche Abfragen bereitgestellt wird. Manchmal sind diese lang, daher möchte ich vi öffnen, die aktuelle Zeile bearbeiten und beim Beenden die Zeile durch den Inhalt in vim ersetzen können. Ich lese Zeilen mit read
. Etwas wie:
query> select .... from .... very long... <ctrl-e>
jetzt in vi
select .... from .... very long...
bearbeiten zu
select ...
from ....
very long ...
Ausfahrt vi
query> select ...
from ....
very long ... <enter>
Abfrage wird ausgeführt.
UPDATE: Die Verwendung von 'set -o vi' vor dem 'read -e' scheint für mich <esc>v
der richtige Weg zu sein, aber derzeit enthält das Öffnen des Puffers nicht das, was sich in der Zeile befindet, sondern eine andere Abfrage aus meinem Verlauf (aber nicht die, die ich vorher getippt habe).
DEFINE _EDITOR = vim
Ihrer Frage hinzufügen, welches Datenbanksystem Sie verwenden.read
Befehl?Antworten:
Zuerst müssen Sie sicherstellen, dass vi als Shell-Befehlszeileneditor verwendet wird:
Jetzt können Sie Ihren Befehl in die Befehlszeile eingeben / kopieren. Verwenden Sie
Esc
oderShift
+, um den Einfügemodus zu verlassen und in den normalen Modus zu wechselnTab
. Jetzt können Sievi
durch Drücken öffnenv
.In
vi
können Sie jetzt alle gewünschten Änderungen vornehmen, den Puffer speichern und beendenvi
, und der Befehl wird ausgeführt.quelle
psql
und auch mit anderen interaktiven Programmen getestet . Es funktioniert nicht, auch wenn ich es einpackerlwrap
.In Bash können Sie mit Ctrl+ x, Ctrl+ einen Editor für die aktuelle Befehlszeile aufrufen e.
Auf dem System, das ich zur Hand haben muss, befindet sich dies nicht in den Dokumenten unter
man readline
sich, sondern imman bash
Abschnitt "Readline". Daher bin ich mir nicht sicher, ob es sich um eine Bash-spezifische Funktion handelt oder ob andere Readline-basierte Programme dies tun würden unterstütze es.Hier ist die Dokumentation von bash:
quelle
read
eingebaute Gerät die interaktivenreadline
Einstellungen (einschließlich deredit-and-execute-command
Bindung) verwendet, müssen Sie es als aufrufenread -e
. Übrigens habe ich bestätigt, dass dies funktioniert.Solange Ihre Eingabeaufforderung eine Shell-Eingabeaufforderung ist (z. B. ein Aufruf an
read
), sind alle anderen Antworten gültig und nützlichWenn dies nicht der Fall ist (diesbezüglich ist Ihnen nicht ganz klar), z. B. wenn Sie einen SQL-Interpreter verwenden
xxxsql
, können Sierlwrap --multi-line -a xxxsql
einen speziellen (konfigurierbaren) Schlüssel verwenden und dann den Editor Ihrer Wahl aufrufen (angegeben durch z. B.export RLWRAP_EDITOR="vim '+call cursor(%L,%C)"
in der Eingabe - Dascall_cursor
ist nützlich, um die Cursorposition beim Aufrufen beizubehalten.vim
)Als zusätzlichen Vorteil haben Sie auch für die mehrzeiligen Befehle (die in einzeilige Befehle "komprimiert" werden, bevor sie in die Verlaufsliste aufgenommen werden, aber bei erneuter Verwendung erneut erweitert werden) den vollständigen Befehlsverlauf.
Bearbeiten: Weitere Informationen finden Sie auf der rlwraps Github-Seite . Wie alle Befehle, die die Verwendung des GNU Readline - Bibliothek der meisten seines Verhaltens wird angegeben in den Benutzern
$INPUTRC
, dierlwrap
hat eine Reihe seiner eigenen Optionen hinzugefügt , dass die Kontrolle, die unter anderem der oben genannte Sondertaste einen externen Editor (aufzurufen CTRL+ ^standardmäßig )quelle
rlwrap
Teil eines separaten Pakets, das ich installieren muss? Es ist nicht auf den paar Linux-Boxen vorhanden, die ich vor mir habe.rlwrap
ist nicht Linux-spezifisch, kann aber in den meisten Distributionen gefunden werden (normalerweise nicht standardmäßig installiert).rlwrap
dass es vollständig im vi-Modus verwendet werden kann. Wenn Sie fügenset editing-mode vi
innen~/.inputrc
dannrlwrap
wird das respektieren und Ihrerlwrap xxxsql
(zBrlwrap sqlite3
) wird vi - Modus verwenden.RLWRAP_EDITOR
Hacks sind nicht erforderlich .psql
postgres und mysql bietenmysql
native Unterstützung für readline, was viel besser funktioniert als der Versuch, sie zu verwendenrlwrap
.sqlplus
leider nicht.rlwrap
(undset editing-mode vi
bestimmen dann nicht den Editor, der für mehrzeilige Bearbeitungen verwendet wird)