Você também pode fazer isso sem usar:
{ echo foo ; cat ; } | command
Eu tenho um comando que quero executar, vamos chamá-lo de program
. É um programa interativo semelhante ao bash ou python REPL.
Eu quero começar este programa com alguma entrada predefinida. Eu tentei program << "some_commands"
. Mas depois de executar some_commands
termina e não consigo continuar interagindo manualmente.
Se este programa fosse bash eu usaria .bashrc
para esse propósito.
Qual é a maneira correta de usar tal programa com a entrada inicial predefinida?
expect
é a ferramenta para este trabalho:
#!/usr/bin/expect -f
spawn program
expect "I'm ready for input"
send "command 1\r"
expect "I'm ready for input"
send "command 2\r"
# ...
send "command last\r"
interact
O comando interact
retorna o controle para o usuário.
Você pode usar o rlwrap para interagir com seu programa. O Rlwrap fornece um editor de linhas baseado na biblioteca readline, o mesmo que o bash usa. Isso normalmente não é tão bom quanto o editor de linhas fornecido pelos programas que fornecem um (por exemplo, você não obterá qualquer coloração ou conclusão de sintaxe), mas é muito mais agradável do que a interface de terminal padrão que compreende apenas backspace.
rlwrap -P 'some_commands' program
O texto é passado para o buffer de entrada mas não é enviado para o programa, então você terá que pressionar Enter depois de iniciar o programa. Todo o texto é passado como uma única string. Pode conter novas linhas.