Como executar um programa que tenha sua própria linha de comando dentro de um programa de script de shell

5

Eu preciso escrever um script de shell para executar automaticamente um conjunto de arquivos por meio de um programa existente ~ 1000 vezes. O programa que estou tentando executá-los é acessado através da linha de comando da seguinte forma, então você carrega os arquivos que você quer que o programa use, digitando "load filetype filename" como segue:

server>./fbat

               *******************************************************
               *                                                     *
               *     *********  * * *          *       *********     *
               *     *          *     *       * *          *         *
               *     *******    *  * *       *   *         *         *
               *     *          *     *     * *** *        *         *
               *     *          *     *    *       *       *         *
               *     *          * * *     *         *      *         *
               *                                                     *
               *          Xin Xu  C1999-2009       v2.0.4Q       *
               *          Program for Population Genetics            *
               *          Harvard School of Public Health            *
               *                                                     *
               *******************************************************

>>load map leprmap.txt

read in 899 markers' info

>>load ped leprped.txt

read in: 899 markers from 16 pedigrees (338 nuclear families,1182 persons)

>>load phe phe_dbpsim2e1.txt

1 quantitative traits have been successfully read
719 persons have been phenotyped

>>trait resid

affection resid** 

>>fbat -v1 -e

(... muita saída aqui)

O arquivo que será alterado em cada execução é phe_dbpsim2e1.txt , cujo nome é incrementado em um número a cada execução. Eu sou capaz de executar o programa a partir de um script, mas uma vez que o programa está aberto, ele não reconhece nenhum dos comandos que estou tentando inserir através do script (isto é, load) e o programa espera que eu insira comandos manualmente . Uma vez que eu saio do programa, todos os meus comandos do script aparecem na tela, então parece que o script que eu escrevi está pausado enquanto o programa está aberto.

Existe uma maneira de inserir comandos no programa depois de aberto sem digitá-los manualmente?

    
por bdarst 31.10.2014 / 22:28

1 resposta

5

Se fbat insistir em obter sua entrada do terminal e você quiser automatizar, a solução é usar expect ( ou pexpect ) . Aqui está um exemplo de um script expect que pode automatizar seu programa:

#!/usr/bin/expect -f
spawn ./fbat
expect ">>"
send "load map leprmap.txt\r"
expect ">>"
send "load phe phe_dbpsim2e1.txt\r"
expect ">>"
send "trait resid\r"

Como não tenho acesso a fbat , o acima, obviamente, não foi testado.

Para instalar o expect em um sistema parecido com o debian, execute:

apt-get install expect
    
por 31.10.2014 / 22:54