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 .