Eu consegui fazer isso
echo -n " command "> / dev / tty1
As letras aparecem e o cursor se move, mas são "fantasmas" - se você pressionar Enter, nada acontece (eles não estão em stdin).
Editar:
No meio da captura de tela abaixo, você vê por que vejo o uso disso. (A linha com uma legenda vermelha, logo abaixo da linha com uma legenda amarela.) Como está agora, você não está realmente "editando" o texto da nota; você é solicitado a escrever um novo texto, que substituirá o texto da nota que você está (na verdade) não editando. Assim, pensei que poderia ser remediado simplesmente colando o texto antigo no tty: se o usuário pressionar enter, nenhuma modificação será feita. (Este programa está em Perl / MySQL, mas pensei que seria mais interessante solicitar uma solução geral do que "como faço isso no Perl".)
Edição 2:
Aqui está o código Perl, que usa o código C abaixo (funciona exatamente como pretendido), bem como uma nova captura de tela - espero que isso esclareça as coisas além da dúvida :) Novamente, olhe para o meio da captura de tela, onde a edição é feita para o texto da nota - desta vez, o texto antigo está lá; por exemplo, se você apenas deseja corrigir um erro de digitação, não precisará digitar novamente o texto inteiro da 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);
Respostas:
Acabei de encontrar um pequeno programa C chamado
writevt
que faz o truque. Pegue o código fonte aqui . Para compilar,gcc
remova primeiro as seguintes linhas:Update . O comando agora faz parte do console-tools , disponível em sistemas mais recentes, a menos que sua distribuição use o kbd em vez do console-tools ; nesse caso, você pode compilá-lo da fonte (versão muito mais recente, nenhuma modificação necessária).
Uso:
Observe que, por algum motivo, você precisa usar
'\r'
(ou'\x0D'
) em vez de'\n'
(ou'\x0A'
) para enviar um retorno.fonte
progname
e_
, e comentário fora algumas chamadas de função emmain()
_()
função geralmente é um sinal de gettext sendo usado. Parece um pouco exagerado para um pedaço de código de demonstração tão simples, mas não machuca, suponho.writevt.c
aqui (em github.com/ grawity ) ; parece ser essencialmente o mesmo programa.Um terminal funciona como duas coisas: um dispositivo de entrada (como um teclado) e um dispositivo de exibição (como um monitor). Quando você lê do terminal, obtém o que vem do dispositivo de entrada. Quando você escreve no terminal, os dados vão para o dispositivo de exibição.
Não existe uma maneira geral de forçar a entrada em um terminal. Raramente é necessário fazer isso. Se você precisar interagir com um programa que exija um terminal, use um emulador de terminal dedicado, como Expect ou Empty , ou um invólucro de terminal programável, como Screen ou Tmux . Você pode forçar a entrada em um console Linux com um ioctl . Você pode forçar a entrada em um emulador de terminal X11 com ferramentas como xdotool ou xmacro .
fonte
screen
outmux
e use o comandostuff
(screen) ousend-key
(tmux) ou o recurso de buffer de colagem.screen
outmux
)?screen -X stuff 'note version one'
.Pelo menos Linux e BSDs têm o TIOCSTI ioctl para enviar caracteres de volta ao buffer de entrada do terminal (até um limite [4096 caracteres no Linux]):
Compile e chame-o como:
para empurrar caracteres de volta em alguns tty.
E em perl:
Edit : Percebo agora que é o mesmo ioctl da solução writevt . O comentário e o nome do comando são enganosos, pois o TIOCSTI funciona em qualquer terminal, não apenas nos VTs.
fonte
Eu tenho uma demonstração mais completa no Stack Overflow .
Em python, você pode fazer:
Isso pressupõe um
"command"
valor simplesls -la
e o caminho tty especificado por OP.fonte