Interagindo com um programa de console interativo em execução de um processo diferente

5

Eu tenho um programa de console com um shell interativo, semelhante ao shell interativo do Python. Existe uma maneira fácil de iniciar este programa interativo A e usar outro programa B para executar A? Eu quero fazer algo assim:

$ /usr/bin/A&
$ #find PID of A somehow
$ somecommand "PID of A" "input string to send to A"
output string from A
$

Que tipo de "somecommand" poderia fazer isso? É isso que "espera" deve facilitar? Eu li a página expect man, mas ainda não tenho ideia do que ela faz.

    
por user3268289 26.09.2014 / 05:57

2 respostas

7

expect é para um propósito diferente. Ele executa comandos em um programa cativo. Você, ao contrário, está pedindo uma maneira de enviar comandos para um processo já em execução em segundo plano.

Como um exemplo mínimo do que você quer, crie um FIFO:

$ mkfifo in

Um FIFO é um arquivo especial que um processo pode gravar enquanto um processo diferente lê a partir dele. Vamos criar um processo para ler nosso arquivo FIFO in :

$ python <in &
[1] 3264

Agora, vamos enviar python um comando para executar a partir do shell atual:

$ echo "print 1+2" >in
$ 3

A saída de python é 3 e aparece aqui no stdout. Se tivéssemos redirecionado o stdout do python, ele poderia ser enviado para outro lugar.

O que expect faz

expect permite automatizar a interação com um comando cativo. Como um exemplo do que expect pode fazer, crie um arquivo:

#!/usr/bin/expect --
spawn python
expect ">>>"
send "print 1+2\r"
expect ">>>"

Em seguida, execute este arquivo com expect :

$ expect myfile
spawn python
Python 2.7.3 (default, Mar 13 2014, 11:03:55) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print 1+2
3
>>> 
    
por 26.09.2014 / 07:47
0

Sim, esse é o tipo de coisa que você pode esperar, onde seu script esperado é seu programa B. Basicamente, ele espera alguma cadeia (talvez um prompt de comando) e então envia uma resposta.

Confira o autoexpecto que ajudará a gerar seu script de expectativa gravando uma sessão. Se você brincar um pouco com ele e inspecionar sua saída, terá uma ideia melhor de como funciona.

    
por 26.09.2014 / 07:50