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

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

Preciso enviar uma entrada padrão ou um código-chave logo após o início do programa.

Por exemplo

$ program | F3

Responder1

Você precisaria definircomeçalá.

Você pode inserir as sequências de caracteres enviadas pelo seu terminal ao pressionar F3no buffer de entrada do dispositivo terminalantesexecutando seu programa com TIOCSTI ioctl() em alguns sistemas como Linux:

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

Ou você pode usar algo como expectexecutar seu programa em uma camada de terminal falsa, esperar que ele gere algum prompt (ou qualquer indicação de que éiniciadoaté o ponto que você espera) e envie essa saída:

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

(aqui esperando um >prompt, substitua por alguma string que programseja exibida quando estiver pronta para ler a entrada).

Você também pode substituir seu stdin por um canal, mas se esse aplicativo espera coisas como F3pressionamentos de tecla, provavelmente é um aplicativo interativo, então provavelmente não gostará dele quando o stdin não for um terminal. Você sempre pode tentar de qualquer maneira:

tput kf3 | program

Porém, depois de programler a saída de tput, ele verá o fim 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 kf3e usamos catpara encaminhar tudo o que você digita no terminal para program. Então, novamente, é improvável que funcione, pois provavelmente programcolocaria o terminal em um modo em que a entrada fosse enviada assim que você digitasse e desabilitasse o echoque não pode mais ser feito, pois sua entrada não é o terminal.

Você poderia fazer a mesma configuração sozinho:

saved_settings=$(stty -g)
stty -icanon -echo min 1 time 0
{ tput kf3; cat; } | program
stty "$saved_settings"

informação relacionada