我需要编写一个 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