Logré hacer esto
echo -n " comando "> / dev / tty1
Aparecen las letras y el cursor se mueve, pero son "fantasmas". Si golpeas Enter, no pasa nada (no están en stdin).
Editar:
En el medio de la siguiente captura de pantalla, puede ver por qué veo el uso de esto. (La línea con un subtítulo rojo, justo debajo de la línea con un subtítulo amarillo). Tal como está ahora, realmente no está "editando" el texto de la nota; solo se le pide que escriba un nuevo texto, que reemplazará el texto de la nota que está editando (no realmente). Por lo tanto, pensé que podría remediarse simplemente pegando el texto antiguo en el tty: si el usuario presiona enter, no se realiza ninguna modificación. (Este programa está en Perl / MySQL, pero pensé que sería más interesante pedir una solución general que "cómo hago esto en Perl").
Edición 2:
Aquí está el código de Perl, que usa el código C a continuación (funciona exactamente como se esperaba), así como una nueva captura de pantalla; con suerte, esto aclarará las cosas más allá de toda duda :) Nuevamente, mire el centro de la captura de pantalla, donde se realiza la edición al texto de la nota: esta vez, el texto anterior está allí, por ejemplo, si solo desea corregir un error tipográfico, no tendrá que volver a escribir todo el texto de la nota.
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);
Respuestas:
Acabo de encontrar un pequeño programa en C llamado
writevt
que hace el truco. Toma el código fuente aquí . Para que se compile congcc
solo elimine las siguientes líneas primero:Actualización . El comando ahora forma parte de las herramientas de la consola , por lo tanto, está disponible en los sistemas más recientes, a menos que su distribución use kbd en lugar de las herramientas de la consola , en cuyo caso puede compilarlo desde la fuente (versión mucho más reciente, no necesita modificación).
Uso:
Tenga en cuenta que, por alguna razón, debe usar
'\r'
(o'\x0D'
) en lugar de'\n'
(o'\x0A'
) para enviar una devolución.fuente
progname
y_
, y comentar algunas llamadas de funciónmain()
_()
función suele ser un signo de que se está utilizando gettext . Parece un poco exagerado para una pieza tan simple de código de demostración, pero no hace daño, supongo.writevt.c
aquí (en github.com/grawity ) ; parece ser esencialmente el mismo programa.Un terminal funciona como dos cosas: un dispositivo de entrada (como un teclado) y un dispositivo de visualización (como un monitor). Cuando lees desde el terminal, obtienes lo que proviene del dispositivo de entrada. Cuando escribe en el terminal, los datos van al dispositivo de visualización.
No hay una forma general de forzar la entrada a un terminal. Rara vez hay necesidad de hacerlo. Si necesita interactuar con un programa que requiere un terminal, use un emulador de terminal dedicado como Expect o Empty , o un contenedor de terminal programable como Screen o Tmux . Puede forzar la entrada a una consola Linux con un ioctl . Puede forzar la entrada en un emulador de terminal X11 con herramientas como xdotool o xmacro .
fuente
screen
otmux
y use su comandostuff
(pantalla) osend-key
(tmux) o su función de pegar búfer.screen
otmux
)?screen -X stuff 'note version one'
.Al menos Linux y BSD tienen el ioctl TIOCSTI para devolver los caracteres al búfer de entrada del terminal (hasta un límite [4096 caracteres en Linux]):
Compílelo y llámelo como:
para hacer retroceder a los personajes en algunos tty.
Y en perl:
Editar : Ahora me doy cuenta de que es el mismo ioctl que en la solución writevt . El comentario y el nombre del comando son engañosos, ya que TIOCSTI funciona para cualquier terminal, no solo para VT.
fuente
Tengo una demostración más completa sobre Stack Overflow .
En python puedes hacer:
Eso supone un
"command"
valor simplels -la
y utiliza la ruta tty especificada por OP.fuente