Ich möchte programmgesteuert einen bestimmten Text in den Befehlszeilenpuffer von bash einfügen, lesen, um ihn zu bearbeiten und als Befehl zu verwenden.
Worauf ich mich freue, ist etwas Ähnliches, read -i
aber für Befehle.
-i text
Wenn zum Lesen der Zeile readline verwendet wird, wird Text vor Beginn der Bearbeitung in den Bearbeitungspuffer eingefügt.
Bearbeiten : Mit programmatisch meine ich, dass Sie dies in ein Skript schreiben möchten , das Skript starten und den Befehlspuffer vorbereiten oder den Befehlsverlauf ändern lassen möchten (wie einige Fragen vorgeschlagen haben).
screen
kann dies für Sie tun.Antworten:
Ich habe auf der Seite mit den fzf-Beispielen einen hackigen Weg gefunden, dies zu tun . Dies funktioniert mit Bash 4.3 und Perl 5.18:
Der Befehl wird in stdout ausgedruckt, aber auch in den Befehlspuffer kopiert. Auf der verlinkten Seite finden Sie auch ein Beispiel, wenn Sie den Befehl direkt ausführen möchten.
quelle
&TIOCSTI
ist ein bisschen schöner als0x5412
auch. Es ist erwähnenswert, dass einige Plattformen (z. B. OpenBSD ) TIOCSTI deaktivieren. Ich denke, das bedeutet, dass sowohl dieser Ansatz als auch der von zshprint -z
nicht funktionieren würden.Wenn dies für eine Funktion gilt, mit der Sie eine Readline-Bindung verwenden möchten
bind -x
, können Sie dies ändernREADLINE_LINE
. ( Beispiel )Außerhalb einer Readline-Bindung können Sie mit einen gefälschten Befehl in den Verlauf verschieben
history -s
.quelle
history -s 'foo'
in einem Skript mache , der Verlauf der gestarteten Shell überhaupt nicht geändert wirdsource
). Sie können nichts von einem separaten Prozess aus tun.Gilles 'Antwort ist richtig, aber nicht ganz zufriedenstellend. Während ich diese Frage lese, möchte das OP die nächste Eingabezeile "voreinstellen". In meinem Fall wollte ich die aktuelle Position des Terminals in meiner PROMPT_COMMAND-Funktion lesen. Das funktioniert, verwendet aber denselben Lesepuffer wie der der primären Shell, und daher werden alle Benutzereingaben durch die Tatsache verworfen, dass ich in der Funktion einen eingebauten Aufruf zum Lesen ausgeführt habe. Daher wollte ich die Benutzereingaben separat lesen, mein Terminal lesen und dann die Leseeingabe wieder in den Eingabepuffer einfügen, was die ursprüngliche Frage ist. Beachten Sie, dass dies tatsächlich innerhalb des gleichen Prozesses liegt, so dass es theoretisch möglich sein sollte.
Soweit ich sehen kann (in meiner Bash 4.2), gibt es keine Funktion, um programmgesteuert etwas auf den Eingabestapel zu verschieben. In zsh wird 'print -z' verwendet.
Die Antwort lautet also: Dies ist in Bash nicht möglich, Sie müssen dafür zsh verwenden.
quelle
Als Alternative zu
history -s 'foo'
versuchen:quelle