如何在 shell 脚本程序中运行具有自己的命令行的程序

如何在 shell 脚本程序中运行具有自己的命令行的程序

我需要编写一个 shell 脚本来通过现有程序自动运行一组文件约 1000 次。我尝试运行它们的程序是通过命令行访问的,如下所示,然后您可以通过键入“加载文件类型文件名”来加载您希望程序使用的文件,如下所示:

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

(...这里有很多输出)

每次运行都会更改的文件是phe_dbpsim2e1.txt,每次运行该文件的名称都会增加一个数字。我可以从脚本执行程序,但是一旦程序打开,它就无法识别我尝试通过脚本输入的任何命令(即加载),并且程序等待我手动输入命令。一旦我退出程序,脚本中的所有命令都会显示在屏幕上,因此看起来我编写的脚本在程序打开时暂停了。

有没有一种方法可以在程序打开后将命令输入到程序中,而无需手动输入?

答案1

如果fbat坚持从终端获取输入并且您想要自动化,解决方案是使用expect(或者pexpect。这是一个expect可以自动化您的程序的脚本示例:

#!/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"

因为我无权访问fbat,所以上面的内容当然没有经过测试。

expect要在类似 Debian 的系统上安装,请运行:

apt-get install expect

相关内容