最近遇到一个问题:需要对单板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。
第一篇博客,参考了许多网友的文章,写的也不是很好。在此非常感谢,也希望该文章能给需要的人带来一点帮助。