shell交互程序自动执行

来源:互联网 发布:如何在知乎专栏写文章 编辑:程序博客网 时间:2024/06/08 00:47

最近遇到一个问题:需要对单板eMMC进行分区,执行fdisk,手动分区。当批量生产时,会使效率极低,且容易出错。经过搜集资料,发现expect可以实现交互程序的自动执行。

1.了解expect

首先在Ubuntu上apt-get install expect,看看是个怎么回事。执行expect,不明所以。man expect 看不懂看不懂。

找度娘,看到了这一篇:http://blog.chinaunix.net/uid-13423116-id-2894410.html。看了一堆理论,不如里面适合我的两个菜鸟程序最给力。感谢博主。

具体expect的用法理论,其实到现在还是不懂,且用且增加吧,此处未完待续。。。

2.交叉编译移植expect

我是要在我的目标板使用expect 啊,当然需要交叉编译移植了。

此处参考了:http://www.csdn123.com/html/topnews201408/51/14751.htm。跪谢。

移植步骤:

(1)下载源码:expect 依赖于tcl,下载地址:http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz。expect下载地址:http://sourceforge.net/projects/expect/files/latest/download?source=files

(2)编译tcl:

tar xvf tcl8.4.11-src.tar.gz

cd tcl8.4.11

        vi README   //大概了解了一下,里面给出了compiling and installing的参考链接

cd unix

./configure --prefix=/home/hya/2100_test/0503/expect/install/tcl --host=i586-poky-linux-uclibc。 //交叉工具链为:i586-poky-linux-uclibc

配置过程中出错提示:checking system version (for dynamic loading)... ./configure: 1: ./configure: Syntax error: Unterminated quoted string。将配置文件第一行改为:#!/bin/bash。

make

make install

在/home/hya/2100_test/0503/expect/install/tcl目录下生成bin  include  lib  man目录,表示OK

(3)编译expect

tar xvf expect5.45.tar.gz

cd expect5.45

./configure //注:expect不支持交叉编译,所以configure选择默认配置,生成Makefile后修改CC

vi Makefile

修改 line:137 CC= i586-poky-linux-uclibc-gcc 保存退出

make

error:

(1)exp_command.c:22:27: fatal error: sys/stropts.h: No such file or directory

修改 vi exp_command.c  使其包含#include <sys/ioctl.h> 去掉<sys/stropts.h>

 (2)ld: cannot find -lieee

修改Makefile,191行,去掉 -lieee

(3)i586-poky-linux-uclibc-gcc \
 -pipe -O2 -fomit-frame-pointer -Wall -fPIC  \
 -Wl,--export-dynamic  \
-o expect exp_main_exp.o \
-L/home/hya/2100_test/0503/expect/expect5.45 -lexpect5.45 \
-L/home/hya/2100_test/0503/expect/tcl8.4.11/unix -ltcl8.4 \
-ldl  -lieee -lm \
-Wl,-rpath,/home/hya/2100_test/0503/expect/__install/tcl/lib \
-Wl,-rpath,/home/hya/2100_test/0503/expect/__install/tcl/lib/expect5.45
/opt/clanton-tiny/1.4.2/sysroots/x86_64-pokysdk-linux/usr/libexec/i586-poky-linux-uclibc/gcc/i586-poky-linux-uclibc/4.7.2/ld: cannot find -lieee
collect2: error: ld returned 1 exit status

修改Makefile,398行,去掉 -lieee

(4)出现 i586-poky-linux-uclibc-gcc \
 -pipe -O2 -fomit-frame-pointer -Wall -fPIC  \
 -Wl,--export-dynamic  \
-o expect exp_main_exp.o \
-L/home/hya/2100_test/0503/expect/expect5.45 -lexpect5.45 \
-L/home/hya/2100_test/0503/expect/tcl8.4.11/unix -ltcl8.4 \
-ldl  -lm \
-Wl,-rpath,/home/hya/2100_test/0503/expect/__install/tcl/lib \
-Wl,-rpath,/home/hya/2100_test/0503/expect/__install/tcl/lib/expect5.45
: expect
(echo 'if {![package vsatisfies [package provide Tcl] 8.4]} {return}' ; \
 echo 'package ifneeded Expect 5.45 \
    [list load [file join $dir libexpect5.45.so]]'\
) > pkgIndex.tcl

仍有问题,不过编译生成了expect 和 libexpect5.45.so,就没有继续往下执行。 

3.目标板使用expect

将tcl生成的目录拷入目标板对应的目录下,将libexpect5.45.so、libtcl8.4.so 拷入/lib目录下

expect 拷入/bin目录下,即可使用。

4.shell中使用expect

将fdisk 分区命令实现自动执行。

不过发现expect片段无法放入 if语句或shell函数中均会提示语法错误,可能是由于exit的原因吧,具体原因还没搞清楚,需要进一步学习expect。

expect<<- END              
spawn fdisk /dev/mmcblk0
expect "n"              //expect的部分自己任意指定,无需特别指出。
send "n\n"
expect "p"
send "p\n"
expect "1"
send "1\n"
expect "par"
send "\n"  
expect "fin"
send "40000\n"
expect "w"    
send "w\n"
expect eof
exit      
END 


第一篇博客,参考了许多网友的文章,写的也不是很好。在此非常感谢,也希望该文章能给需要的人带来一点帮助。


0 0