Fügen Sie Text in den Bash-Befehlszeilenpuffer ein

9

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 -iaber 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).

gioele
quelle
IIRC screenkann dies für Sie tun.
strugee
1
Diese Antwort auf SU .
Kamil Maciorowski

Antworten:

6

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:

writecmd () { 
  perl -e 'ioctl STDOUT, 0x5412, $_ for split //, do{ chomp($_ = <>); $_ }' ; 
}

# Example usage
echo 'my test cmd' | writecmd

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.

trhodes
quelle
Diese Antwort kommt der vom OP geforderten am nächsten.
reza.safiyat
Etwas andere Syntax in dieser Antwort , &TIOCSTIist ein bisschen schöner als 0x5412auch. Es ist erwähnenswert, dass einige Plattformen (z. B. OpenBSD ) TIOCSTI deaktivieren. Ich denke, das bedeutet, dass sowohl dieser Ansatz als auch der von zsh print -znicht funktionieren würden.
dimo414
4

Wenn dies für eine Funktion gilt, mit der Sie eine Readline-Bindung verwenden möchten bind -x, können Sie dies ändern READLINE_LINE. ( Beispiel )

Außerhalb einer Readline-Bindung können Sie mit einen gefälschten Befehl in den Verlauf verschieben history -s.

Gilles 'SO - hör auf böse zu sein'
quelle
Das Problem ist, dass, wenn ich history -s 'foo'in einem Skript mache , der Verlauf der gestarteten Shell überhaupt nicht geändert wird
Gioele
@gioele Sie müssen es aus der Shell heraus starten (z. B. aus einem Skript, mit dem Sie laden source). Sie können nichts von einem separaten Prozess aus tun.
Gilles 'SO - hör auf böse zu sein'
2

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.

Stijn Hoop
quelle
0

Als Alternative zu history -s 'foo'versuchen:

echo 'foo' >> ~/.bash_history
history -n

# or
history -s 'foo'
history -a
history -n
kcd
quelle