Necesito enviar una entrada estándar o un código clave inmediatamente después de que se inicie el programa.
Por ejemplo
$ program | F3
Respuesta1
Necesitarías definirempiezaallá.
Puede insertar las secuencias de caracteres enviadas por su terminal cuando presiona F3
en el búfer de entrada del dispositivo terminalantesejecutando su programa con TIOCSTI ioctl() en algunos sistemas como Linux:
{
perl -le 'require "sys/ioctl.ph";
ioctl(STDIN, &TIOCSTI, $_) for split "","@ARGV"' "$(tput kf3)"
program
}
O puede usar algo como expect
ejecutar su programa en una capa de terminal falsa, esperar a que genere algún mensaje (o cualquier indicación de que escomenzóhasta el punto esperado), y envíe esa salida luego:
expect -c 'spawn -noecho program; expect {>} {send [exec tput kf3]}; interact'
(aquí esperando un >
mensaje, reemplácelo por alguna cadena que program
se genere cuando esté listo para leer la entrada).
También puede reemplazar su entrada estándar con una tubería, pero si esa aplicación espera cosas como F3presionar teclas, lo más probable es que sea una aplicación interactiva, por lo que probablemente no le gustará que su entrada estándar no sea una terminal. Siempre puedes intentarlo de todos modos:
tput kf3 | program
Sin embargo, después de program
leer el resultado de tput
, verá el final del archivo (no hay nada más que leer), lo que puede provocar que se cierre. Con:
{ tput kf3; cat; } | program
Enviamos la salida de kf3
y luego usamos cat
para reenviar todo lo que escribe en el terminal a program
. Por otra parte, es poco probable que funcione, ya que lo más probable program
es que ponga el terminal en un modo en el que la entrada se envíe tan pronto como escriba y deshabilite lo echo
cual ya no puede hacer porque su entrada no es el terminal.
Podrías hacer la misma configuración tú mismo:
saved_settings=$(stty -g)
stty -icanon -echo min 1 time 0
{ tput kf3; cat; } | program
stty "$saved_settings"