使用Bash 编程构建易用的Linux系统


经验与交流 计算机与信息技术 ·89· 使用Bash编程构建易用的Linux系统 陈建 黄崎兰 (天津工业大学 计算机与自动化学院,天津市 300160) 摘 要 本文介绍了基于 Fedora Core 6 平台,利用 yum 等软件包管理工具和 axel 或 wdget 基于文本的下载软件实现软 件的下载和安装。 关键词 Bash Shell;Mplayer;Realplay;Firefox 1 引言 对于普通电脑用户而言,用 Linux 系统的还是少数一些 人。主要是 Linux 版本太多,标准不统一,这是 Linux 发展 所亟待解决的问题,Linux 的最大优势就在于它是一种开放源 代码的操作系统,任何人都可以自由访问它的源代码。在日 常应用中,Linux 有很多不尽如人意的地方,其中软件的安装 就是一个方面,有些软件如果直接编译源代码,可能会出现 各种错误,这对普通用户来说肯定是一个很困难的问题。现 在很多软件都用软件包封装起来,常用的主要是 Redhat 公司 的 RPM 包封装和 Debian 的 deb 软件包封装方式。但是安装时 需要解决软件包之间的依赖关系,也是一个相当麻烦的事情。 本文主要是基于 Fedora Core 6 平台,利用 yum 等软件包 管理工具和 axel 或 wdget 基于文本的下载软件实现软件的下 载和安装。大家知道,在 Fedora Core 6 中有基于图形的软件 在线安装、卸载和更新工具,但是该工具有几个问题,例如 速度奇慢,有些软件版本太旧等,而且有些非开源软件如 Realplay、GoogleEarth 等没有。而且像 yum 工具对于普通的 用户也有可能不会用。本文实现的程序可以解决这个问题。 2 程序设计实现 2.1 InstallLib 等函数的设计与实现 由于一些软件的运行,例如 Mplayer 播放器、Firefox 浏 览器的运行需要安装较早版本的编译器和一些库文件包例如 gcc3.4、gcc2.96、compat-libf2c-34、compat-libstdc++-33、 compat-libstdc++-296 等,函数 InstallLib 就是实现这些软件 包的安装的。该函数利用 yum 软件包管理工具进行安装,要 安装的软件包的名字存储在文件 NeedToUpdatePKG 中,函数 InstallLib 读该文件获得软件包的名字,然后利用yum 工具进 行在线安装,需要注意的是,在文件 NeedToUpdatePKG 中, 包含有通配符“*”,例如 compat-gcc*,因此,以防当前文件 夹中含有类似 compat-gcc*的文件名的文件,以进程的标识号 (由$$获得)命名创建了一个临时文件夹,函数 InstallLib 的 所有安装操作都是在该临时文件夹内操作的,完成所有的安 装操作后,退出并删除该临时文件夹。另外,为使安装能顺 利进行,还得停止 yum-updatesd 服务。该服务用于自动检测 系统内是否有需要更新的软件包,如果有则提示用户。如果 不暂时停用该服务,可能会提示错误信息。函数部分代码如 下所示: _InstallLib_DIR_=$$ echo "In order to run Firefox correctly,need to install some packages as follows:" cat NeedToUpdatePKG echo "Do you want to install those packages now? " read CONFIRM service yum-updatesd stop if [ "$CONFIRM" = "Y" ] || [ "$CONFIRM" = "y" ] || [ "$CONFIRM" = "yes" ] || [ "$CONFIRM" = "Yes" ]; then if [ ! -d $_InstallLib_DIR_ ]; then while: do mkdir $_InstallLib_DIR_ if [ "$?" -eq "0" ]; then cd $_InstallLib_DIR_ # ============= while: do # while read CONTENTS do read CONTENTS0 yum -y install $CONTENTS done<../NeedToUpdatePKG if [ "$?" -eq "0" ]; then break else continue fi done cd .. # =============== rm -rf $_InstallLib_DIR_ ·90· 计算机与信息技术 经验与交流 service yum-updatesd start return 0 else continue fi done fi # 注意有些程序代码省略掉了 fi 函数 MplayerYumInstall、Chinese_char_set_Install 的实现 与函数 InstallLib 的实现基本上相似,此处不再赘述。 2.2 函数 Wrong 的设计与实现 该函数用于在出现错误时显示错误信息,并提示用户确 认,在得到用户的确认后会删除相应的软件包。函数代码如 下所示: ErrorMessage=$1 Default=$2 SoftWare=$3 echo "$ErrorMessage [y/n][default: $Default]: " read confirm : ${confirm:="$2"} case $confirm in y|Y|yes|Yes) rm -rf downlowd/$SoftWare 1>/dev/null 2>&1 ;; *) exit 1 ;; esac 2.3 函数 CreateDIR 的设计与实现 函数 CreateDIR 的功能是创建目录,例如当用户输入 Firefox 的 安装目录为/usr/local/FireFox/firefox2.04/firefox 时 , 如 果 在 目 录 /usr/local/ FireFox 或目录/usr/local/FireFox/ firefox2.04 不存在的情况 下,直接使用命令: # mkdir /usr/local/FireFox/firefox2.04/firefox 创建用户输入的安装目录,则会提示错误信息: mkdir: cannot create directory ‘/usr/local/FireFox/ firefox 2.04/ firefox’;No such file or directory 意即无法创建目录‘/usr/local/FireFox/firefox2.04/firefox’;没有该文件 或目录。 因此,为使创建目录成功,需要从顶直下逐级检测目录 是否存在,如果目录不存在则创建目录,直至最后一级目录。 函数 CreateDIR 实现的关键代码如下所示: for loop in `echo $1|sed 's/\//\n /g'`; do if [ -n $loop ]; then tmpPath="$tmpPath/$loop" if [ -d $tmpPath ]; then: else mkdir $tmpPath fi fi done 2.4 FirefoxInstall 等函数的设计与实现 函数 FirefoxInstall 的功能是下载和安装 firefox 浏览器。 该函数首先下载该软件的*.tar.gz 压缩包到当前目录下的指定 的 download 目录中,并从下载地址中提取软件包的名字以备 接下来检测和安装软件用,提取软件包名字的语句为: SOFTWARE=`echo $Address|awk -F/ '{print $NF}'` 其次进行一系列的检测,例如检测下载的软件包是否存在, 检测下载的压缩包是否完好等,以保证下载的软件包存在并 且完好无损,然后是对下载的软件压缩包进行解压并安装到 指定的目录中,并创建桌面图标。另外需要注意的是,该函 数需要用户输入的是绝对路径,并有相应的判断语句。函数 FirefoxInstall 安装部分的代码如下所示: isOK=`gunzip -tvv download/$SOFTWARE 2>&1 |awk '{print $2}'` if [ "$isOK" = "OK" ]; then while:; do tar -xzvf download/$SOFTWARE if [ "$?" -eq "0" ]; then mv firefox $InstallPath createDTIcon "firefox" "$InstallPath/firefox/ firefox\n" \ "$InstallPath/firefox/icons/mozicon128.png" "to boot up firefox" return 0 else if [ "$Counter0" -gt 3 ]; then Wrong "There is something wrong again when \ extract file,do you want to begin from the scratch?" "Y" "$SOFTWARE" continue 2 fi Wrong "There is something wrong when extract file,\ whether you try again or not? " "N" "NULL" Counter0=`expr $Counter0 + 1` continue 1 fi done # --------------- else Wrong "There is something wrong about the file which \ just downloaded,do you try again from the scratch?" "Y" "$SOFTWARE" continue 1 fi 函数 RealPlayInstall、AdobeReaderInstall、GoogleEarthIn stall 的实现和函数 FirefoxInstall 的实现很相似,只是下载的 RealPlay、GoogleEarth 的软件包是以二进制格式*.bin 存在的, 故在安装部分略有不同,例如函数 RealPlayInstall 的安装部分 的源代码为: 经验与交流 计算机与信息技术 ·91· chmod u+x download/$SOFTWARE1 ./download/$SOFTWARE1 |tee /tmp/realInstall.tmp isError=`grep "Error" /tmp/realInstall.tmp` isOK=`grep "[Dd]one" /tmp/realInstall.tmp` if [ -n "$isOK" -a -z "$isError" ]; then realPath=`grep "Destination" /tmp/realInstall. tmp|awk '{print $2}'` realPath=`echo $realPath|sed 's/\/$//g'` if [ -d $realPath ]; then createDTIcon "realplay" "$realPath/realplay" \ "$realPath/share/icons/realplay_48x48.png" "boot up realplayer" fi echo "Install successfully!!! " return 0 rm -rf /tmp/realInstall.tmp fi ## 注意程序中有些代码省略调了 2.5 程序文件 InstallSoftware 设计与实现 上述进行安装的函数都是通过相应的文件进行调用的, 最后的程序脚本文件 InstallSoftware 是把各个功能模块综合 起来,为用户提供一个方便易用的界面。该文件首先提示用 户本脚本可以安装软件的名称,并请求用户确认。然后是创 建 download 目录,接下来是提示用户是否安装运行软件所需 要的库文件和较早版本的编译器,如果用户确认安装则调用 InstallLib 进行安装。之后便进入安装列表界面。用户的每次 选择都会写入一个文件 ThisHistory,在选择一次之后用户的 第二次选择将会无效。实现代码如下所示: echo -e "\t Your choose history is: " cat ThisHistory 2>/dev/null echo -e -n "\tYour choose is[ 1,2,3,4,5,6,7,q ]: " read ChooseInstall case $ChooseInstall in 1) isInstalled=`grep "1" ThisHistory 2>/dev/null` if [ -z "$isInstalled" ]; then bash mplayerInstall.sh echo "1" >>ThisHistory else echo "mplayer had been installed,hit return key to continue " read mplayer_Dummy continue fi ;; # 以下类似代码省略 7)isInstalled=`grep "7" ThisHistory 2>/dev/null ` if [ ! -z "$isInstalled" ]; then echo "All program had been installed,Thanks to use this program! " read All_Dummy continue else isInstalled=`grep "1" ThisHistory 2>/dev/null ` if [ -z "$isInstalled" ]; then bash mplayerInstall.sh echo "1" >>ThisHistory fi echo "7" >>ThisHistory # 以下类 似代码省略 fi ;; 程序最后运行的效果图如图1所示。 图1 程序运行示意图 3 本论文需改进的地方 在编写本文讲述的程序过程中,作者想尽力能编得好些, 但总是会出现很多的错误和不尽如人意的地方。另外,在运行 任务失败时的检测上,还有许多地方做得不够好。最后,需要 注意的是,本文讲述的程序的功能是实现自动从网上下载相应 的软件,并自动进行安装,所以,如果服务器端地址变动,可 能会使程序不能成功运行,例如在作者刚编好程序时运行无 误,可是过段时间发现在下载 realplay 安装程序时出现了错误, 在作者重新配置完服务器地址后,方才使程序正常运行。 4 总结 本论文通过 bash shell 编程,实现了几个软件的自动配置 和安装,提供了使 Linux 易用的一种方式和一种思维方法。 虽然本论文讲述的程序有些简单,但是提供了一种使 Linux 易用的方法,通过该程序,用户无需再很麻烦地去找相应的 软件,无需麻烦地去下载,只需要运行该脚本,输入想要安 装的目录,及其它一些参数,便会完成整个过程。 参考文献 [1] David Tansley 著 徐焱 张春萌等译.LINUX 与 UNIX Shell 编程指南[M] . 1 版.北京:机械工业出版社,2000 年 [2] Mendel Cooper. The Advanced Bash Scripting Guide[Z]. 2000年 [3] Dale Dougherty & Arnold Robbins.sed & awk[Z]. 2 版.1997年3月 [4] 电脑商情在线[EB/OL]. [2007-07-17]http://www. cbinews.com/linux/showcontent.jsp?articleid=21916 修稿日期:9 月 3 日 修稿日期:9 月 15 日 作者简介:陈建(1979-),男,山东成武人,硕士,主 要研究方向:嵌入式 Linux 开发;黄琦兰(1966-),女, 江西人,硕士,副教授,主要研究方向:自动控制。
还剩2页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 3 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

nakajima

贡献于2014-05-15

下载需要 3 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf