Ist es in einer interaktiven Bash- Shell möglich, einen Befehl einzugeben, der Text ausgibt, so dass er bei der nächsten Eingabeaufforderung angezeigt wird, als hätte der Benutzer diesen Text bei dieser Eingabeaufforderung eingegeben?
Ich möchte in der Lage sein, source
ein Skript zu erstellen , das eine Befehlszeile generiert und so ausgibt, dass es angezeigt wird, wenn die Eingabeaufforderung nach dem Ende des Skripts zurückkehrt, sodass der Benutzer es optional bearbeiten kann, bevor er auf drückt enter
, um es auszuführen.
Dies kann jedoch nur erreicht werden xdotool
, wenn sich das Terminal in einem X-Fenster befindet und wenn es installiert ist.
[me@mybox] 100 $ xdotool type "ls -l"
[me@mybox] 101 $ ls -l <--- cursor appears here!
Kann das nur mit bash gemacht werden?
Antworten:
Mit
zsh
können Sieprint -z
Text für die nächste Eingabeaufforderung in den Zeileneditorpuffer einfügen:würde den Zeileneditor vorbereiten, mit
echo test
dem Sie bei der nächsten Eingabeaufforderung bearbeiten können.Ich glaube nicht, dass
bash
es eine ähnliche Funktion gibt. Auf vielen Systemen können Sie den Eingabepuffer des Endgeräts jedoch mit denTIOCSTI
ioctl()
folgenden Befehlen füllen :Würde
echo test
in den Eingabepuffer des Endgeräts einfügen , als ob er vom Endgerät empfangen würde.Eine tragbarere Variante des @ mike-
Terminology
Ansatzes , die die Sicherheit nicht einschränkt , besteht darin, dem Terminal-Emulator eine recht standardmäßigequery status report
Escape-Sequenz zu senden :<ESC>[5n
Welche Terminals antworten (also als Eingabe)<ESC>[0n
und binden diese an die Zeichenfolge, die Sie einfügen möchten:Wenn Sie sich in GNU befinden
screen
, können Sie auch Folgendes tun:Mit Ausnahme des TIOCSTI ioctl-Ansatzes bitten wir den Terminal-Emulator, uns eine Zeichenfolge wie eingegeben zu senden. Wenn diese Zeichenfolge kommt, bevor
readline
(bash
der Zeileneditor) das lokale Echo des Terminals deaktiviert hat, wird diese Zeichenfolge nicht an der Shell-Eingabeaufforderung angezeigt, wodurch die Anzeige leicht durcheinander gebracht wird.Um dies zu umgehen, können Sie entweder das Senden der Anforderung an das Terminal etwas verzögern, um sicherzustellen, dass die Antwort eintrifft, wenn das Echo durch Readline deaktiviert wurde.
(hier unter der Annahme, dass Sie
sleep
eine Auflösung von weniger als einer Sekunde unterstützen).Idealerweise möchten Sie Folgendes tun:
Allerdings
bash
(im Gegensatz zuzsh
) hat keine Unterstützung für solchewait-until-the-response-arrives
, die die Antwort nicht lesen.Es hat jedoch eine
has-the-response-arrived-yet
Funktion mitread -t0
:Weitere Lektüre
Siehe @ starfry Antwort ist , dass baut auf den beiden gegebenen Lösungen von @mikeserv und mich mit ein paar ausführlichere Informationen.
quelle
bind '"\e[0n": "echo test"'; printf '\e[5n'
wahrscheinlich die einzige Antwort, die ich suche. Für mich geht das. Ich werde jedoch auch^[[0n
vor meiner Aufforderung gedruckt. Ich habe festgestellt, dass dies verursacht wird, wenn$PS1
eine Subshell enthalten ist. Sie können es reproduzieren, indem SiePS1='$(:)'
vor dem Bindebefehl ausführen. Warum sollte das passieren und kann etwas dagegen unternommen werden?\r
könntest du vielleicht einfach eine Wende machen$PS1
? Das sollte funktionieren, wenn$PS1
es lang genug ist. Wenn nicht, dann dort setzen^[[M
.r
macht den Trick. Dies verhindert natürlich nicht die Ausgabe, sie wird nur überschrieben, bevor das Auge sie sieht. Ich denke,^[[M
die Zeile wird gelöscht, um den eingefügten Text zu löschen, falls er länger als die Eingabeaufforderung ist. Ist das richtig (ich konnte es nicht in der ANSI-Escape-Liste finden, die ich habe)?Diese Antwort dient der Klarstellung meines eigenen Verständnisses und wurde von @ StéphaneChazelas und @mikeserv vor mir inspiriert.
TL; DR
bash
ohne fremde hilfe ist dies nicht möglich ;ioctl
aberbash
Lösung verwendetbind
.Die einfache Lösung
Bash hat eine eingebaute Shell
bind
, die es ermöglicht, einen Shell-Befehl auszuführen , wenn eine Tastensequenz empfangen wird. Im Wesentlichen wird die Ausgabe des Shell-Befehls in den Eingabepuffer der Shell geschrieben.Die Tastenfolge
\e[0n
(<ESC>[0n
) ist ein ANSI-Terminal-Escape-Code , den ein Terminal sendet, um anzuzeigen, dass es normal funktioniert. Es sendet dies als Antwort auf eine Gerätestatusberichtsanforderung, die als gesendet wird<ESC>[5n
.Indem
echo
wir die Antwort an eine binden, die den einzufügenden Text ausgibt, können wir diesen Text jederzeit einfügen, indem wir den Gerätestatus abfragen. Dazu wird eine<ESC>[5n
Escape-Sequenz gesendet.Dies funktioniert und reicht wahrscheinlich aus, um die ursprüngliche Frage zu beantworten, da keine anderen Tools beteiligt sind. Es ist pur
bash
, setzt aber auf ein gut funktionierendes Terminal (praktisch alle).Der wiedergegebene Text bleibt in der Befehlszeile zur Verwendung bereit, als ob er eingegeben worden wäre. Es kann angehängt, bearbeitet und durch Drücken
ENTER
von ausgeführt werden.Fügen Sie
\n
den gebundenen Befehl hinzu, damit er automatisch ausgeführt wird.Diese Lösung funktioniert jedoch nur im aktuellen Terminal (das im Rahmen der ursprünglichen Frage liegt). Es funktioniert über eine interaktive Eingabeaufforderung oder über ein bereitgestelltes Skript, löst jedoch einen Fehler aus, wenn es in einer Subshell verwendet wird:
Die richtige Lösung, die als nächstes beschrieben wird, ist flexibler, stützt sich jedoch auf externe Befehle.
Die richtige Lösung
Die richtige Methode zum Einfügen von Eingaben verwendet tty_ioctl , einen Unix-Systemaufruf für die E / A-Steuerung , der einen
TIOCSTI
Befehl zum Einfügen von Eingaben enthält.TIOC von " T erminal IOC tl " und STI von " S end T erminal I nput ".
Dafür ist kein Befehl eingebaut
bash
. Dies erfordert einen externen Befehl. Es gibt keinen solchen Befehl in der typischen GNU / Linux-Distribution, aber es ist nicht schwierig, ihn mit ein wenig Programmierung zu erreichen. Hier ist eine Shell-Funktion, die Folgendes verwendetperl
:Hier
0x5412
ist der Code für denTIOCSTI
Befehl.TIOCSTI
ist eine Konstante, die in den Standard-C-Header-Dateien mit dem Wert definiert ist0x5412
. Versuchen Sie esgrep -r TIOCSTI /usr/include
oder schauen Sie rein/usr/include/asm-generic/ioctls.h
; es ist indirekt in C-Programmen von enthalten#include <sys/ioctl.h>
.Sie können dann Folgendes tun:
Implementierungen in einigen anderen Sprachen werden unten gezeigt (in einer Datei speichern und dann
chmod +x
):Perl
inject.pl
Sie können festlegen,
sys/ioctl.ph
welche DefinitionenTIOCSTI
anstelle des numerischen Werts verwendet werden sollen. Sehen Sie hierPython
inject.py
Rubin
inject.rb
C
inject.c
kompilieren mit
gcc -o inject inject.c
**! ** Es gibt weitere Beispiele hier .
Unter Verwendung
ioctl
dieses Werk in Subshells zu tun. Es kann auch in andere Terminals eingespeist werden, wie im Folgenden erläutert wird.Weiterentwickeln (andere Terminals steuern)
Dies würde den Rahmen der ursprünglichen Frage sprengen, es ist jedoch möglich, Zeichen in ein anderes Terminal einzufügen, sofern die entsprechenden Berechtigungen vorliegen. Normalerweise bedeutet dies sein
root
, aber siehe unten für andere Möglichkeiten.Wenn Sie das oben angegebene C-Programm erweitern, um ein Befehlszeilenargument zu akzeptieren, das die tty eines anderen Terminals angibt, können Sie Folgendes in dieses Terminal einfügen:
Es sendet auch eine neue Zeile standardmäßig aber ähnlich
echo
, es bietet eine-n
Möglichkeit , es zu unterdrücken. Die Option--t
oder--tty
erfordert ein Argument - dastty
des zu injizierenden Terminals. Der Wert hierfür kann in diesem Terminal abgerufen werden:Kompiliere es mit
gcc -o inject inject.c
. Stellen Sie dem einzufügenden Text ein Präfix voran,--
wenn er Bindestriche enthält, um zu verhindern, dass der Argument-Parser Befehlszeilenoptionen falsch interpretiert. Sehen./inject --help
. Benutze es so:oder nur
den Stromanschluss zu injizieren.
Für das Injizieren in ein anderes Terminal sind Administratorrechte erforderlich, die erhalten werden können durch:
root
,sudo
,CAP_SYS_ADMIN
Fähigkeit odersetuid
Zuweisen
CAP_SYS_ADMIN
:Zuweisen
setuid
:Ausgabe reinigen
Eingefügter Text wird vor der Eingabeaufforderung angezeigt, als wäre er vor der Eingabeaufforderung eingegeben worden (was tatsächlich der Fall war), wird jedoch nach der Eingabeaufforderung erneut angezeigt.
Eine Möglichkeit, den Text vor der Eingabeaufforderung auszublenden, besteht darin, der Eingabeaufforderung einen
\r
Zeilenumbruch ( kein Zeilenvorschub) voranzustellen und die aktuelle Zeile zu löschen (<ESC>[M
):Dadurch wird jedoch nur die Zeile gelöscht, in der die Eingabeaufforderung angezeigt wird. Wenn der eingefügte Text Zeilenumbrüche enthält, funktioniert dies nicht wie beabsichtigt.
Eine andere Lösung deaktiviert das Echo von eingefügten Zeichen. Ein Wrapper verwendet
stty
dazu:wo
inject
ist eine der oben beschriebenen lösungen oder ersetzt durchprintf '\e[5n'
.Alternative Ansätze
Wenn Ihre Umgebung bestimmte Voraussetzungen erfüllt, stehen Ihnen möglicherweise andere Methoden zur Verfügung, mit denen Sie Eingaben einfügen können. Wenn Sie sich in einer Desktop-Umgebung befinden, ist xdotool ein X.Org- Dienstprogramm, das Maus- und Tastaturaktivitäten simuliert, das Ihre Distribution jedoch möglicherweise nicht standardmäßig enthält. Du kannst es versuchen:
Wenn Sie den Terminal-Multiplexer tmux verwenden , können Sie dies tun:
wo
-t
wählt welche Sitzung und Bereich zu injizieren. GNU Screen hat eine ähnliche Fähigkeit mit seinemstuff
Befehl:Wenn Ihre Distribution das Paket console-tools enthält , haben Sie möglicherweise einen
writevt
Befehl, derioctl
wie in unseren Beispielen verwendet wird. Die meisten Distributionen haben dieses Paket jedoch zugunsten von kbd abgelehnt , dem diese Funktion fehlt.Eine aktualisierte Kopie von writevt.c kann mit kompiliert werden
gcc -o writevt writevt.c
.Andere Optionen, die für einige Anwendungsfälle besser geeignet sind, sind Expect und Empty, mit denen interaktive Tools skriptgesteuert werden können.
Sie können auch eine Shell verwenden, die die Terminalinjektion unterstützt, wie
zsh
dies möglich istprint -z ls
.Die "Wow, das ist schlau ..." Antwort
Die hier beschriebene Methode wird auch hier besprochen und baut auf der hier besprochenen Methode auf .
Eine Shell-Umleitung von
/dev/ptmx
erhält ein neues Pseudo-Terminal:Ein kleines in C geschriebenes Tool, das den Pseudoterminal-Master (ptm) entsperrt und den Namen des Pseudoterminal-Slaves (pts) an seine Standardausgabe ausgibt.
(speichern unter
pts.c
und kompilieren mitgcc -o pts pts.c
)Wenn das Programm mit einer Standardeingabe von ptm aufgerufen wird, entsperrt es die entsprechenden Punkte und gibt seinen Namen an die Standardausgabe aus.
Die Funktion unlockpt () entsperrt das Slave-Pseudoterminal, das dem Master-Pseudoterminal entspricht, auf das der angegebene Dateideskriptor verweist. Das Programm übergibt dies als Null, was die Standardeingabe des Programms ist .
Die Funktion ptsname () gibt den Namen des Slave-Pseudoterminals zurück, das dem Master entspricht, auf den der angegebene Dateideskriptor verweist, und übergibt für die Standardeingabe des Programms erneut Null.
Ein Prozess kann mit dem Punkt verbunden werden. Holen Sie sich zuerst ein ptm (hier ist es dem Dateideskriptor 3 zugeordnet, der vom
<>
Redirect mit Lese- und Schreibzugriff geöffnet wird ).Dann starte den Prozess:
Die von dieser Befehlszeile ausgehenden Prozesse lassen sich am besten wie folgt veranschaulichen
pstree
:Die Ausgabe ist relativ zur aktuellen Shell (
$$
) und die PID (-p
) und PGID (-g
) jedes Prozesses werden in Klammern angezeigt(PID,PGID)
.Am Anfang des Baums befindet
bash(5203,5203)
sich die interaktive Shell, in die wir Befehle eingeben, und ihre Dateideskriptoren verbinden sie mit der Terminalanwendung, die wir für die Interaktion mit ihr verwenden (xterm
oder ähnlichem).Bei nochmaliger Betrachtung des Befehls starteten die ersten Klammern eine Subshell,
bash(6524,6524)
wobei der Dateideskriptor 0 (die Standardeingabe ) den PTS (die mit Lese- und Schreibzugriff geöffnet werden) zugewiesen wurde, die<>
von einer anderen Subshell zurückgegeben wurden, die./pts <&3
zum Entsperren der PTS ausgeführt wurde Punkte, die dem Dateideskriptor 3 zugeordnet sind (der im vorherigen Schritt erstellt wurdeexec 3<>/dev/ptmx
).Der Dateideskriptor 3
3>&-
der Subshell ist geschlossen ( ), so dass der ptm nicht darauf zugreifen kann. Seine Standardeingabe (fd 0), die die Punkte darstellt, die beim Lesen / Schreiben geöffnet wurden, wird>&0
auf seine Standardausgabe (fd 1) umgeleitet (tatsächlich wird die fd - kopiert ).Dadurch wird eine Subshell erstellt, deren Standardeingabe und -ausgabe mit den pts verbunden ist. Es kann eine Eingabe gesendet werden, indem in das ptm geschrieben wird, und die Ausgabe kann durch Lesen des ptm angezeigt werden:
Die Subshell führt diesen Befehl aus:
Es wird in einer neuen Sitzung
bash(6527,6527)
im interaktiven (-i
) Modus ausgeführt (setsid -c
beachten Sie, dass PID und PGID identisch sind). Der Standardfehler wird auf die Standardausgabe (2>&1
) umgeleitet und über die Pipeline weitergeleitet,tee(6528,6524)
sodass er sowohl in einelog
Datei als auch in die Punkte geschrieben wird. Dies gibt eine andere Möglichkeit, die Ausgabe der Subshell zu sehen:Da die Subshell
bash
interaktiv ausgeführt wird, können Befehle zur Ausführung gesendet werden, wie in diesem Beispiel, in dem die Dateideskriptoren der Subshell angezeigt werden:Das Lesen der Ausgabe (
tail -f log
odercat <&3
) der Subshell zeigt:Der Standardeingang (fd 0) ist mit dem Punkt verbunden, und sowohl der Standardausgang (fd 1) als auch der Fehler (fd 2) sind mit derselben Pipe verbunden, die mit Folgendem verbunden ist
tee
:Und ein Blick auf die Dateideskriptoren von
tee
Standardausgabe (fd 1) ist der Punkt: Alles, was 'tee' in seine Standardausgabe schreibt, wird an den Punkt zurückgesendet. Standardfehler (fd 2) sind die Punkte, die zum steuernden Terminal gehören.
Verpacken
Das folgende Skript verwendet die oben beschriebene Technik. Es wird eine interaktive
bash
Sitzung eingerichtet, die durch Schreiben in einen Dateideskriptor eingefügt werden kann. Es ist hier verfügbar und mit Erläuterungen dokumentiert.quelle
bind '"\e[0n": "ls -l"'; printf '\e[5n'
Lösung, wird doch die Ausgabe derls -l
auch^[[0n
auf dem Terminal ausgegeben, sobald ich die Eingabetaste drücke und damit laufels -l
. Irgendwelche Ideen, wie man es bitte "versteckt"? Vielen Dank.PS1="\r\e[M$PS1"
vorher versuchtbind '"\e[0n": "ls -l"'; printf '\e[5n'
und das hat den von Ihnen beschriebenen Effekt gebracht.Es hängt davon ab , was Sie bedeuten
bash
nur . Wenn Sie eine einzelne, interaktivebash
Sitzung meinen, lautet die Antwort fast definitiv nein . Und das liegt daran, dass Sie selbst dann, wenn Sie einen Befehl wiels -l
in der Befehlszeile eines beliebigen kanonischen Terminals eingeben,bash
noch nicht einmal darüber informiert sind - undbash
zu diesem Zeitpunkt noch nicht einmal daran beteiligt sind.Vielmehr ist bis zu diesem Zeitpunkt passiert, dass die tty-Zeilendisziplin des Kernels gepuffert und
stty echo
die Benutzereingaben nur auf dem Bildschirm angezeigt wurden. Es spült diesen Eingang seine Leser -bash
, im Beispielfall - Zeile für Zeile - und übersetzt im Allgemeinen\r
eturns zu\n
ewlines auf Unix - Systemen als auch - und sobash
ist nicht - und so kann weder Ihre sourced Skript sein - darauf aufmerksam gemacht, es irgendeine Eingabe, bis der Benutzer dieENTER
Taste drückt .Nun gibt es einige Workarounds. Die robusteste Methode ist überhaupt keine Umgehungsmöglichkeit und umfasst die Verwendung mehrerer Prozesse oder speziell geschriebener Programme, um Eingaben zu sequenzieren, die Zeilendisziplin
-echo
vor dem Benutzer zu verbergen und nur auf den Bildschirm zu schreiben, was bei der Interpretation von Eingaben als angemessen erachtet wird besonders wenn nötig. Dies kann schwierig zu bewerkstelligen sein, da es bedeutet, Interpretationsregeln zu schreiben, die willkürlich eingegebene Zeichen für Zeichen verarbeiten und gleichzeitig ohne Fehler ausschreiben können, um zu simulieren, was der durchschnittliche Benutzer in diesem Szenario erwarten würde. Aus diesem Grund wird das interaktive Terminal-I / O wahrscheinlich so selten gut verstanden - eine so schwierige Perspektive, die sich für die meisten nicht für weitere Untersuchungen eignet.Eine andere Problemumgehung könnte den Terminalemulator betreffen. Sie sagen, dass ein Problem für Sie eine Abhängigkeit von X und von ist
xdotool
. In diesem Fall könnte ein Workaround, den ich anbieten werde, ähnliche Probleme haben, aber ich werde trotzdem weitermachen.Das wird in einem
xterm
w / theallowwindowOps
Resource Set funktionieren . Es speichert zuerst die Symbol- / Fensternamen auf einem Stapel, setzt dann die Symbolzeichenfolge des Terminals auf die^Umy command
Anforderung, dass das Terminal diesen Namen in die Eingabewarteschlange einfügt, und setzt ihn zuletzt auf die gespeicherten Werte zurück. Es sollte unsichtbar für interaktivebash
Shellsxterm
funktionieren, die mit der richtigen Konfiguration ausgeführt werden - aber es ist wahrscheinlich eine schlechte Idee. Bitte beachten Sie die Kommentare von Stéphane unten.Hier ist jedoch ein Bild, das ich von meinem Terminologieterminal aufgenommen habe, nachdem ich das
printf
Bit mit einer anderen Escape-Sequenz auf meinem Computer ausgeführt habe. Für jede neue Zeile imprintf
Befehl habe ichCTRL+V
dann getipptCTRL+J
und anschließend dieENTER
Taste gedrückt . Ich habe danach nichts mehr getippt, aber, wie Sie sehen, das Terminalmy command
für mich in die Eingabewarteschlange der Leitung eingespeist:Der wirkliche Weg, dies zu tun, ist mit einer verschachtelten Pty. So
screen
und sotmux
- beides kann Ihnen das übrigens ermöglichen.xterm
kommt eigentlich mit einem kleinen programm das aufgerufen wirdluit
das kann man auch machen. Es ist jedoch nicht einfach.Hier ist eine Möglichkeit, wie Sie:
Das ist keineswegs portabel, sollte aber auf den meisten Linux-Systemen funktionieren, wenn die entsprechenden Öffnungsberechtigungen vorliegen
/dev/ptmx
. Mein Benutzer ist in dertty
Gruppe, die auf meinem System ausreicht. Du brauchst auch ...... das, wenn es auf einem GNU-System (oder einem anderen mit einem Standard-C-Compiler, der auch von stdin lesen kann) ausgeführt wird, eine kleine ausführbare Binärdatei namens
pts
ausschreibt, die dieunlockpt()
Funktion auf ihrem stdin ausführt und in ihr stdout schreibt Name des Pty-Geräts, das gerade entsperrt wurde. Ich habe es geschrieben, als ich daran gearbeitet habe ... Wie komme ich zu dieser Pty und was kann ich damit machen? .Wie auch immer, das obige
bash
Codebit führt eine Shell in einer Schicht unterhalb der aktuellen Schicht aus.bash
wird angewiesen, alle Ausgaben in das Slave-Pty zu schreiben, und das aktuelle Tty wird sowohl nicht für-echo
seinen Eingang als auch für das Puffern konfiguriert , sondern um es (meistens)raw
zu übergebencat
, woraufhin es kopiert wirdbash
. Und währenddessencat
kopiert ein weiterer Hintergrund alle Slave-Ausgaben auf das aktuelle Tty.Zum größten Teil wäre die obige Konfiguration völlig nutzlos - im Grunde genommen nur redundant - mit der Ausnahme, dass wir
bash
mit einer Kopie des eigenen Pty-Masters starten<>9
. Dies bedeutet, dassbash
mit einer einfachen Umleitung frei in einen eigenen Eingabestream geschrieben werden kann. Alles wasbash
zu tun ist:... um mit sich selbst zu reden.
Hier ist ein weiteres Bild:
quelle
xterm
können Sie weiterhin den Symboltitel abfragen,\e[20t
jedoch nur, wenn dies mit konfiguriert wurdeallowWindowOps: true
.xterm
w / the proper config. W / a Xterm eigentliche, können Sie lesen und schreiben Sie den Copy / Paste-Puffer und so wird es außerdem einfacher, denke ich. Xterm verfügt auch über Escape-Sequenzen zum Ändern / Beeinflussen der Begriffsbeschreibung.\e[20t
(nicht\e]1;?\a
)?
Abfrage ist nur für Schrift und Farbe , nicht TitelObwohl die
ioctl(,TIOCSTI,)
Antwort von Stéphane Chazelas natürlich die richtige ist, können einige Leute mit dieser teilweisen, aber trivialen Antwort zufrieden sein: Schieben Sie einfach den Befehl auf den Verlaufsstapel, und der Benutzer kann 1 Zeile nach oben in den Verlauf springen, um den zu finden Befehl.Dies kann ein einfaches Skript werden, das einen eigenen Verlauf mit einer Zeile hat:
read -e
ermöglicht das readline editieren der eingabe,-p
ist eine aufforderung.quelle
. foo.sh
Quelle ( oder `source foo.sh) stammt, anstatt in einer Subshell ausgeführt zu werden. Interessanter Ansatz. Ein ähnlicher Hack, bei dem der Kontext der aufrufenden Shell geändert werden muss, besteht darin, eine benutzerdefinierte Vervollständigung einzurichten, die die leere Zeile zu etwas erweitert und dann den alten Vervollständigungshandler wiederherstellt.eval
wenn Sie einfache Befehle zum Bearbeiten haben, ohne Pipes und Umleitung usw.Oh mein Wort, wir haben eine einfache integrierte Lösung für Bash verpasst : Der
read
Befehl hat eine Option-i ...
, die bei Verwendung mit-e
Text in den Eingabepuffer schiebt. Von der Manpage:Erstellen Sie also eine kleine Bash-Funktion oder ein Shell-Skript, das den Befehl verwendet, um ihn dem Benutzer zu präsentieren, und dessen Antwort ausführt oder auswertet:
Dies verwendet zweifellos das ioctl (, TIOCSTI,), das es schon seit über 32 Jahren gibt, da es bereits in 2.9BSD ioctl.h existiert .
quelle