Como enviar entrada padrão através de um tubo

1

Eu preciso enviar uma entrada padrão ou um código de tecla logo após o início do programa.

Por exemplo

$ program | F3
    
por Shervan 27.09.2016 / 18:20

1 resposta

5

Você precisaria definir começa lá.

Você pode inserir as seqüências de caracteres enviados pelo seu terminal ao pressionar F3 no buffer de entrada do dispositivo terminal antes executando seu programa com o TIOCSTI ioctl () em alguns sistemas como o Linux:

{
   perl -le 'require "sys/ioctl.ph";
   ioctl(STDIN, &TIOCSTI, $_) for split "","@ARGV"' "$(tput kf3)"
   program
}

Ou você pode usar algo como expect para rodar seu programa em uma camada de terminal falsificada, espere que ele gere algum prompt (ou qualquer indicação de que ele é iniciado até o ponto que você espera para), e enviar essa saída então:

expect -c 'spawn -noecho program; expect {>} {send [exec tput kf3]}; interact'

(aqui esperando um prompt > , substitua por alguma string que program produz quando estiver pronto para ler entrada).

Você também pode substituir seu stdin por um pipe, mas se esse aplicativo espera coisas como pressionamentos de teclas F3 , é mais provável que seja um aplicativo interativo, então provavelmente não vai gostar quando o stdin não for um terminal . Você pode sempre tentar:

tput kf3 | program

No entanto, depois que program ler a saída de tput , verá o final do arquivo (nada mais para ser lido), o que pode fazer com que ele saia. Com:

{ tput kf3; cat; } | program

Enviamos a saída de kf3 e usamos cat para encaminhar tudo o que você digita no terminal para program . Então, novamente, é improvável que funcione como o mais provável program colocaria o terminal em um modo onde a entrada é enviada assim que você digita e desabilita o echo que ele não pode mais fazer como sua entrada não é o terminal.

Você pode e faz a mesma configuração:

saved_settings=$(stty -g)
stty -icanon -echo min 1 time 0
{ tput kf3; cat; } | program
stty "$saved_settings"
    
por 27.09.2016 / 18:34