以下文章仅仅代表此人个人观点,与我本人无关
说到linux 就离不开shell, 其实Windows ,os 都是离不开shell的, shell是计算人机对话的语言。 简单的说你计算机干什么, shell他吧,呵呵。
从最简单的 ./ 运行一个程序,到复杂的条件编译, makefile , 项目的组织,等等,他都可以轻松的搞定。
功能不可以不说的很强很暴力。
简单的运用是把所有的命令都写到一个文件, 他们可以一条一条的执行, 然后你就不用每次都敲命令,等他运行完, 再敲命令。
#! /sbin/sh 这个很重要, 有时不写也可以认, 最好写把,如果你有多个shell的话
cd weather
qmake
make
cp app/weather.app ../buildrpm-weather/opt/apps/
cd ../buildrpm-weather/
sudo./build.sh
cp *.rpm ../opgl
cd ..
cd stock
qmake
make
cp app/stock.app ../buildrpm-stock/opt/apps/
cd ../buildrpm-stock
sudo ./build.sh
cp *.rpm ../opgl
cd ..
cd tsphost
qmake
make
cp app/tsp.app ../buildrpm-tsp/opt/apps/
cd ../buildrpm-tsp
sudo ./build.sh
cp *.rpm ../opgl
cd ..
cd netradio
qmake
make
cp app/netradio.app ../buildrpm-netradio/opt/apps/
cd ../buildrpm-netradio
sudo ./build.sh
cp *.rpm ../opgl
cd ..
上面的意思大意是: 编译weather 、stock 、tsphost 、netradio 这四个工程, 然后把他们分别放到不同的目录下打成.rpm 包(rpm 包在linux下等同与Android 的apk,是作为安装程序包),然后把他们放到同一个目录下, 如果不这样做,每次替换一些东西都要很繁杂的命令,让你很烦。
下面介绍复杂一点的用法
这个我们大哥哥写的把程序打包的shell 涉及到两个文件
文件一:build.sh
#! /bin/sh
user=shejiaming
name=`awk '/Name/{print $2}' module.spec`
// module.spec 文件中Name 开头的行 的第二个参数赋值给name netradio
这里说一下awk 它是个很强大的类是与正则表达式一样的东西,可以自动截取空格,匹配空格
echo RPM module name is $name
cp module.spec ${name}.spec
[ -n "$(find opt/cfgs -type d -empty)" ] && rm -rfopt/cfgs
-n :示 非空字符串
find opt/cfgs:寻找opt/cfgs
-type d : 文件类型是目录
-empty:是否为空
&&:表示前面返回值是0(||表示返回非0) linux争取时返回0,错误返回非零,这个你懂的。
意思为如果该目录为空,即目录下没有文件,就删除它,免得打包占空间
[ -n "$(find opt/datas -type d -empty)" ] && rm -rfopt/datas
[ -n "$(find opt/libs -type d -empty)" ] && rm -rf opt/libs
[ -n "$(find opt/apps -type d -empty)" ] && rm -rfopt/apps
[ -n "$(find opt/plugins -type d -empty)" ] && rm -rfopt/plugins
[ -n "$(find opt/deps -type d -empty)" ] && rm -rfopt/deps
[ -n "$(find opt/others -type d -empty)" ] && rm -rfopt/others
[ -n "$(find opt/fonts -type d -empty)" ] && rm -rfopt/fonts
tar zcvf ${name}.tar.gz opt usr
把opt 和 usr 目录打包成.tar.gz
cp ${name}.tar.gz /home/${user}/rpmbuild/SOURCES
cp 到某个目录下
cp module.spec /home/${user}/rpmbuild/SOURCES/${name}.spec
cp 到某个目录下
rpmbuild -bb ${name}.spec
打包命令
cp /home/${user}/rpmbuild/RPMS/i386/${name}*.rpm ./
把打包后的文件拷贝到当前目录
if [ ! -d "tmp" ]; then
mkdir tmp
fi
创建tmp目录
mv ${name}.spec tmp
mv ${name}.tar.gz tmp
在此简单介绍一下什么叫做打成rpm包
Rpm打包是linux下常用的一种工程管理方法, 作用是把你的二进制文件和相关的资源,比如说你程序需要读取某个文件什么的,全部打成一个包,然后就很方便上传啊,安装啊,升级啊,等等了,而且也可以压缩。
文件二:module.spec
#(*)概述
Summary: foryou ivi application atmeego
Summary 是一行关于该软件包的描述。
#(*)名称
#(*)版本
Version: 1.0.0
#(*)发布次数
Release: 1
License: GPL
Group: System
Source: %{name}.tar.gz
资源
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
告诉 RPM 这是在构建期间临时安装文件的地方
网站地址 描述性没有特殊作用
Prefix: %{_prefix}
编译 预处理 资源连接
Prefix: %{_sysconfdir}
%define userpath /
#(*)作者
Packager: wangbi
#(*)描述
%description
foryouFont.ttf
libsocketforyou.so
libuartcom.so
autorunapps.sh
killapps.sh
%prep
%setup -c
%install
install -d $RPM_BUILD_ROOT%{userpath}
安装
cp -a ../%{name}*/* $RPM_BUILD_ROOT%{userpath}
%clean
rm -rf $RPM_BUILD_ROOT
rm -rf $RPM_BUILD_DIR/%{name}-%{version}
%files
/opt/*
这个文件是rpm 打包的设置文件
下面介绍个更加难的,我们的程序安装shell (install-on-ubuntu.sh)
#!/bin/sh
if [ -z "$(grep /usr/opt/cfgs /etc/profile)" ]; then
判断语句
-z:判断字符串为空 返回真 ,就是如果/usr/opt/cfgs 没有在环境变量中添加的话就添加它
echo "export APP_CFG_PATH=/usr/opt/cfgs" >> /etc/profile
echo "export APP_PROC_PATH=/usr/opt/apps" >> /etc/profile
echo "export APP_DATA_PATH=/usr/opt/datas" >> /etc/profile
echo "export APP_PLUGIN_PATH=/usr/opt/plugins" >>/etc/profile
echo "export APP_PHONE_DEV=/dev/ttyUSB6" >> /etc/profile
echo "export APP_PPP_DEV=ttyUSB4" >> /etc/profile
#echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/opt/libs">> /etc/profile
fi
if [ -z "$(grep /usr/opt/cfgs /etc/ld.so.conf)" ]; then
echo "/usr/opt/libs" >> /etc/ld.so.conf
ldconfig
ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令
ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令.
fi
export APP_CFG_PATH=/usr/opt/cfgs
export APP_PLUGIN_PATH=/usr/opt/plugins
export APP_PROC_PATH=/usr/opt/apps
export APP_DATA_PATH=/usr/opt/datas
export APP_PHONE_DEV=/dev/ttyUSB6
export APP_PPP_DEV=ttyUSB4
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/opt/libs
if [ ! -d "$PWD/debs" ]; then
-d:如果目录存在
mkdir debs
fi
rm -rf debs/*
cdir=$PWD/rpms
for dir in $(find $cdir -type f); do
循环查找当前rpms目录下的所有文件,即每个rpm包
filename=`basename $dir`
basename:显示文件或者目录的基本名称,比如/home/chen/juny/XXX.rpm, 返回XXX.rpm
alien -d rpms/$filename
alien –d : 把rpm包转换为deb包,因为ubuntu下只支持deb包,当我们的工程要在ubuntu下跑时,需要转换一下
mv *.deb debs
mv命令来为文件或目录改名或将文件由一个目录移入另一个目录中。
# debname=$(echo $filename|sed's/rpm/deb/g')
done
cdir=$PWD/debs
for dir in $(find $cdir -type f); do
filename=`basename $dir`
dpkg -i --force-alldebs/$filename
dpkg:linux下的一个包安装工具
“Debian” 专门开发的套件管理系统,方便软件的安装、更新及移除
done
cd $cdir
cp -a /usr/opt/apps/desktop_ubuntu.app /usr/opt/apps/desktop.app
最后是在meego系统上安装 shell install.sh 语法类似在此不做赘述
#!/bin/sh
if [ -z "$(grep /opt/cfgs /etc/profile)" ]; then
echo "export APP_CFG_PATH=/opt/cfgs" >> /etc/profile
echo "export APP_PROC_PATH=/opt/apps" >> /etc/profile
echo "export APP_DATA_PATH=/opt/datas" >> /etc/profile
echo "export APP_PLUGIN_PATH=/opt/plugins" >> /etc/profile
echo "export APP_PLUGIN_PATH=/opt/plugins" >> /etc/profile
echo "chmod 777 /dev/ttyUSB*" >> /etc/profile
echo "ldconfig" >> /etc/profile
#echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/libs">> /etc/profile
fi
if [ -z "$(grep /opt/cfgs /etc/ld.so.conf)" ]; then
echo "/opt/libs" >> /etc/ld.so.conf
ldconfig
fi
export APP_CFG_PATH=/opt/cfgs
export APP_PLUGIN_PATH=/opt/plugins
export APP_PROC_PATH=/opt/apps
export APP_DATA_PATH=/opt/datas
export APP_PHONE_DEV=/dev/ttyUSB6
export APP_PPP_DEV=ttyUSB4
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/libs
cdir=$PWD/rpms
for dir in $(find $cdir -type f); do
filename=`basename $dir`
echo $filename
rpm -ivh --force --nodepsrpms/$filename
done
cd $cdir