A maneira complicada é usar expect
, que falsifica um terminal completo para o processo ser reproduzido:
#!/usr/bin/env expect
# Spawn a ucp process
spawn -noecho ucp
# wait until the ucp's command line appears
expect -ex "whatever the ucp command line prompt looks like here"
# access ucp's functionality with a command "run recog"
send -- "run recog\r"
# not sure what needs to happen here, so let's wait for
# ucp to exit (may also need to handle timeout or
# the output buffer being full or ...)
expect eof
Em seguida, você pode executar o script acima como runucp &
ou o que você decidir chamá-lo em seu shell.
Como nota lateral, o método de entrada padrão mais simples echo blah | ...
às vezes falhará, pois os programas podem descartar a entrada, por exemplo, um programa pode descartar todas as entradas antes de apresentar o primeiro prompt, lendo e descartando essa entrada:
% cat prompter
#!/usr/bin/env expect
sleep 3 ;# simulate load of something big and bloated
read stdin ;# toss any existing input
puts -nonewline "prompt> "
puts "got >>>[gets stdin]<<<"
% print -l a b c d e f g | ./prompter
prompt> got >>><<<
ou por meio de uma chamada tcflush(3)
. expect
permite evitar essa condição por meio da chamada expect -x "detect prompt here"
, o que indica que o processo gerado provavelmente está ativo e pronto para entrada.