J'ai réussi à faire ça
echo -n " commande "> / dev / tty1
Les lettres apparaissent et le curseur se déplace, mais ce sont des "fantômes" - si vous frappez Enter, rien ne se passe (ils ne sont pas en stdin).
Éditer:
Au milieu de la capture d'écran ci-dessous, vous voyez pourquoi je vois l'utilisation de cela. (La ligne avec une légende rouge, juste en dessous de la ligne avec une légende jaune.) Comme c'est le cas actuellement, vous n'éditez pas vraiment le texte de la note; il vous est simplement demandé d'écrire un nouveau texte, qui remplacera le texte de la note que vous éditez (pas vraiment). Ainsi, j'ai pensé qu'il pourrait être remédié en collant simplement l'ancien texte dans le tty: si l'utilisateur appuie sur Entrée, aucune modification n'est apportée. (Ce programme est en Perl / MySQL, mais j'ai pensé qu'il serait plus intéressant de demander une solution générale que "comment faire cela en Perl".)
Modifier 2:
Voici le code Perl, qui utilise le code C ci-dessous (fonctionne exactement comme prévu), ainsi qu'une nouvelle capture d'écran - j'espère que cela clarifiera les choses hors de tout doute :) Encore une fois, regardez au milieu de la capture d'écran, où l'édition est effectuée au texte de la note - cette fois-ci, l'ancien texte est là, par exemple si vous vouliez juste corriger une faute de frappe, vous n'aurez pas à retaper l'intégralité du texte de la note.
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);
Réponses:
Je viens de trouver un petit programme C appelé
writevt
qui fait l'affaire. Récupérez le code source ici . Pour le compiler,gcc
supprimez d'abord les lignes suivantes:Mettre à jour . La commande fait maintenant partie de console-tools , donc disponible dans les systèmes plus récents, à moins que votre distribution utilise kbd au lieu de console-tools , auquel cas vous pouvez la compiler depuis la source (version beaucoup plus récente, aucune modification nécessaire).
Usage:
Notez que, pour une raison quelconque, vous devez utiliser
'\r'
(ou'\x0D'
) au lieu de'\n'
(ou'\x0A'
) pour envoyer un retour.la source
progname
et_
et commenter quelques appels de fonctionmain()
_()
fonction est généralement un signe d'utilisation de gettext . Semble un peu exagéré pour un morceau de code de démonstration aussi simple mais ne fait pas de mal, je suppose.writevt.c
ici (sur github.com/ grawity ) ; il semble qu'il s'agisse essentiellement du même programme.Un terminal se double de deux éléments: un périphérique d'entrée (tel qu'un clavier) et un périphérique d'affichage (tel qu'un moniteur). Lorsque vous lisez à partir du terminal, vous obtenez ce qui vient du périphérique d'entrée. Lorsque vous écrivez sur le terminal, les données vont sur le périphérique d'affichage.
Il n'existe aucun moyen général de forcer l'entrée dans un terminal. Il est rarement nécessaire de le faire. Si vous devez interagir avec un programme qui nécessite un terminal, utilisez un émulateur de terminal dédié tel que Expect ou Empty , ou un wrapper de terminal programmable tel que Screen ou Tmux . Vous pouvez forcer l'entrée dans une console Linux avec un ioctl . Vous pouvez forcer l'entrée dans un émulateur de terminal X11 avec des outils tels que xdotool ou xmacro .
la source
screen
outmux
et utilisez leur commandestuff
(screen) ousend-key
(tmux) ou leur fonction de tampon de collage.screen
outmux
)?screen -X stuff 'note version one'
.Au moins Linux et BSD ont l'ioctl TIOCSTI pour repousser les caractères vers le tampon d'entrée du terminal (jusqu'à une limite [4096 caractères sous Linux]):
Compilez-le et appelez-le comme:
pour repousser les caractères sur certains tty.
Et en perl:
Edit : je me rends compte maintenant que c'est le même ioctl que dans la solution writevt . Le commentaire et le nom de la commande sont trompeurs car TIOCSTI fonctionne pour n'importe quel terminal, pas seulement pour les VT.
la source
J'ai une démo plus complète sur Stack Overflow .
En python, vous pouvez faire:
Cela suppose une
"command"
valeur simplels -la
et en utilisant le chemin tty spécifié par OP.la source