Por que o comando interact da expect não está funcionando?

7

Estou tentando automatizar o gdb com expectativa. Meu script irá iniciar o gdb, fazer alguma inicialização e, em seguida, passar o controle para o usuário. O comando interact do Expect parece ser a ferramenta perfeita para o trabalho.

Agora considere:

$ echo "spawn gdb
    expect \"(gdb) \"
    send \"help\r\"
    expect \"(gdb) \"
    interact" | expect -

Nas minhas máquinas, esse scriptlet gera o gdb, emite o comando help, como esperado. Mas então ele sai imediatamente do script e me retorna ao prompt bash. Eu esperaria que o usuário ficasse no gdb e pudesse emitir comandos.

Alguma ideia do que sinto falta aqui?

    
por Nicolas Bonnefon 24.10.2013 / 13:53

1 resposta

11

interact receberá sua entrada da entrada padrão expects , que é o canal para echo agora fechado.

Você pode escrevê-lo (sintaxe ksh / zsh / bash):

expect <(echo "spawn gdb
  expect \"(gdb) \"
  send \"help\r\"
  expect \"(gdb) \"
  interact" )

Isso ainda é alimentado por meio de um pipe, mas, desta vez, o pipe é fornecido como um argumento de caminho para expect , então a stdin do expect não é afetada.

Neste caso, o óbvio para escrever seria:

expect -c '
  spawn gdb
  expect "(gdb)"
  send "help\r"
  expect "(gdb) "
  interact'

expect como sh e a maioria dos shells permitem passar scripts inline com -c .

Se você ainda precisar transmitir a saída de um comando (como echo no seu caso), poderá fazê-lo com -c com:

expect -c "$(echo...)"

Isso significa que, no entanto, ao contrário das abordagens de pipe, expect não será iniciado até que o comando seja concluído.

BTW, aqui, você poderia usar um arquivo .gdbinit ou -ix para gdb , você realmente não precisa de expect .

    
por 24.10.2013 / 17:00