Como ecoar stdin redirecionado

2

Eu executo um aplicativo de um arquivo de script e redireciono o stdin para ele a partir daqui - doc assim:

my_cli << HERE_DOC
enable
configure
10
exit
exit
HERE_DOC

Isso funciona como esperado, mas não vejo nem a entrada nem a saída do aplicativo. O aplicativo é um prompt interativo escrito em C. Quando interajo manualmente com ele, vejo o prompt em si e as respostas à minha entrada, mas quando executo o script mencionado, não vejo nada. Eu gostaria que ele imprimisse a entrada e a saída como se um usuário real estivesse digitando. Você sabe como conseguir isso?

    
por FireAphis 26.09.2010 / 17:15

3 respostas

3

Parece que deve haver uma maneira melhor, mas você pode usar uma função de wrapper:

wrapper () { local text=$(</dev/stdin); echo "$text"; my_cli <<<"$text"; }
wrapper << HERE_DOC
enable
configure
10
exit
exit
HERE_DOC

Para processar o documento aqui, linha por linha:

wrapper2 () { local line; while read -r line; do echo "$line"; my_cli <<<"$line"; done; }

Se você interagir manualmente com o seu programa, ele exibe a saída? Ele sai para stdout ou stderr?

Outra opção que pode funcionar para você é expect .

    
por 26.09.2010 / 17:57
1

Eu vejo o Perl!

Bem, você não pode fazer isso se estiver usando qx ou chamadas de sistema, já que elas estão bloqueando por natureza (sim, você pode fazer system ("program &") ou chamá-lo de outro thread e desanexá-lo .

Tópico do iniciador:

threads->create( sub { 
                    threads->self->detach(); 
                    qx"$cmd > file1.cmd";
});

Código principal::

threads->create( sub {
while (1) { 
 get file size, if it is bigger than second ago - read new line, increase size
 parse new line, if any?
 sleep 1;
}
} );

Melhor use POE::Wheel::FollowTail

Outra solução é redirecionar a saída de cada um dos seus programas para o nome fifo e ler todos eles do seu prog, mantendo-se atento a novas linhas.

man mkfifo
    
por 26.09.2010 / 21:28
1
(tee /dev/fd/42 | mycmd) 42>&1 <<EOF
blah
blah
EOF

Não parecerá exatamente como um usuário real - todas as entradas serão impressas imediatamente. expect é provavelmente melhor para isso.

    
por 27.09.2010 / 20:51

Tags