Das habe ich geschafft
echo -n " Befehl "> / dev / tty1
Die Buchstaben erscheinen und der Cursor bewegt sich, aber sie sind "Geister" - wenn Sie drücken Enter, passiert nichts (sie sind nicht im Standard).
Bearbeiten:
In der Mitte des folgenden Screenshots sehen Sie, warum ich die Verwendung dieses sehe. (Die Zeile mit der roten Beschriftung, direkt unter der Zeile mit der gelben Beschriftung.) Sie bearbeiten den Hinweistext derzeit nicht wirklich. Sie werden lediglich aufgefordert, einen neuen Text zu schreiben, der den Text der Notiz ersetzt, die Sie (nicht wirklich) bearbeiten. Daher dachte ich, es könnte durch einfaches Einfügen des alten Textes in das tty behoben werden: Wenn der Benutzer die Eingabetaste drückt, wird keine Änderung vorgenommen. (Dieses Programm ist in Perl / MySQL, aber ich dachte, es wäre interessanter, nach einer allgemeinen Lösung zu fragen, als "wie mache ich das in Perl".)
Bearbeiten 2:
Hier ist der Perl-Code, der den C-Code unten verwendet (funktioniert genau wie vorgesehen), sowie ein neuer Screenshot - dies wird hoffentlich die Dinge zweifelsfrei klären :) Schauen Sie sich noch einmal die Mitte des Screenshots an, in der die Bearbeitung erfolgt zum Notizentext - diesmal ist der alte Text vorhanden. Wenn Sie beispielsweise nur einen Tippfehler korrigieren möchten, müssen Sie nicht den gesamten Notizentext erneut eingeben.
my $edit_note_text = $edit_note_data[2];
print BOLD, RED, " new text: ", RESET;
system("writevt /dev/tty \"$edit_note_text\"");
my $new_text = <$in>;
$new_text = fix_input($new_text);
my $set_text = "UPDATE notes SET note = \"$new_text\" WHERE id = $edit_note_id";
$db->do($set_text);
Antworten:
Ich habe gerade ein kleines C-Programm namens gefunden
writevt
, das den Trick macht. Besorgen Sie sich den Quellcode hier . Um es zu kompilieren,gcc
entfernen Sie zuerst die folgenden Zeilen:Update . Der Befehl ist jetzt Teil der Konsolentools und steht daher in neueren Systemen zur Verfügung, sofern Ihre Distribution nicht kbd anstelle der Konsolentools verwendet . In diesem Fall können Sie ihn aus dem Quellcode kompilieren (viel neuere Version, keine Änderung erforderlich).
Verwendung:
Beachten Sie, dass Sie aus irgendeinem Grund
'\r'
(oder'\x0D'
) anstelle von'\n'
(oder'\x0A'
) verwenden müssen, um eine Rückgabe zu senden.quelle
progname
und_
auskommentieren und ein paar Funktionsaufrufe einfügenmain()
_()
Funktion ist normalerweise ein Zeichen dafür, dass gettext verwendet wird. Scheint ein bisschen übertrieben für ein so einfaches Stück Demo-Code, schadet aber wohl nicht.writevt.c
hier (bei github.com/ grawity ) ; es scheint im Wesentlichen das gleiche Programm zu sein.Ein Terminal hat zwei Funktionen: ein Eingabegerät (z. B. eine Tastatur) und ein Anzeigegerät (z. B. ein Monitor). Wenn Sie vom Terminal lesen, erhalten Sie, was vom Eingabegerät kommt. Wenn Sie in das Terminal schreiben, werden die Daten auf das Anzeigegerät übertragen.
Es gibt keine allgemeine Möglichkeit, Eingaben in ein Terminal zu erzwingen. Es gibt selten eine Notwendigkeit, dies zu tun. Wenn Sie mit einem Programm interagieren müssen, für das ein Terminal erforderlich ist, verwenden Sie einen dedizierten Terminal-Emulator wie Expect oder Empty oder einen programmierbaren Terminal-Wrapper wie Screen oder Tmux . Sie können die Eingabe in eine Linux-Konsole mit einem ioctl erzwingen . Sie können die Eingabe in einen X11-Terminalemulator mit Tools wie xdotool oder xmacro erzwingen .
quelle
screen
oder austmux
und verwenden Sie den Befehlstuff
(screen) odersend-key
(tmux) oder die Funktion zum Einfügen von Puffern.screen
oder dentmux
Werkzeugen)?screen -X stuff 'note version one'
.Mindestens Linux und BSDs verfügen über das TIOCSTI ioctl, um Zeichen in den Terminal-Eingabepuffer zurückzuschieben (bis zu einer Grenze von [4096 Zeichen unter Linux]):
Kompilieren Sie es und nennen Sie es wie folgt:
Zeichen auf einige tty zurückschieben.
Und in Perl:
Edit : Mir ist jetzt klar, dass es das gleiche ioctl ist wie in der Writevt- Lösung. Der Kommentar und der Name des Befehls sind irreführend, da TIOCSTI für jedes Terminal funktioniert, nicht nur für VTs.
quelle
Ich habe eine vollständigere Demo über Stack Overflow .
In Python können Sie:
Dies setzt einen einfachen
"command"
Wert fürls -la
und die Verwendung des von OP angegebenen tty-Pfads voraus.quelle