手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

Bash 实例,第 3 部分

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

新的、更通用的脚本


#!/usr/bin/env bash



# P is the package name



P=sed-3.02



# A is the archive name



A=$.tar.gz



export ORIGDIR=`pwd`

export WORKDIR=$/work

export SRCDIR=$/$



if [ -z "$DISTDIR" ]

then 

    # set DISTDIR to /usr/src/distfiles if not already set

    DISTDIR=/usr/src/distfiles

fi

export DISTDIR



if [ -d $ ]

then    

    # remove old work directory if it exists 

    rm -rf $

fi



mkdir $

cd $

tar xzf $/$

cd $

./configure --prefix=/usr

make

已向代码中添加了很多环境变量,但是,他基本上还是执行同一功能。但是,假如现在要要编译任何标准的 GNU 基于 autoconf 的源代码 tar 压缩包,只需简单地将该文档复制到一个新文档(用合适的名称来反映他所编译的新包名),然后将 "$A" 和 "$P" 的值更改成新值即可。任何其他环境变量都自动调整成正确配置,并且脚本按预想工作。虽然这很方便,但是代码更有改进余地。这段代码比我们开始创建的 "transcript" 脚本要长很多。既然任何编程项目的目标之一是减少用户复杂度,所以最好大幅度缩短代码,或至少更好地组织代码。能够用一个巧妙的方法来做到这点 -- 将代码拆成两个单独文档。将该文档存为 "sed-3.02.ebuild":

sed-3.02.ebuild


#the sed ebuild file -- very simple!

P=sed-3.02

A=$.tar.gz

   

第一个文档不重要,只包含那些必须在每个包中配置的环境变量。下面是第二个文档,他包含操作的主要部分。将他存为 "ebuild",并使他成为可执行文档:

ebuild 脚本


#!/usr/bin/env bash





if [ $# -ne 1 ]

then 

    echo "one argument expected."

    exit 1

fi



if [ -e "" ]

then 

    source 

else

    echo "ebuild file  not found."

    exit 1

fi



export ORIGDIR=`pwd`

export WORKDIR=$/work

export SRCDIR=$/$



if [ -z "$DISTDIR" ]

then 

    # set DISTDIR to /usr/src/distfiles if not already set

    DISTDIR=/usr/src/distfiles

fi

export DISTDIR



if [ -d $ ]

then    

    # remove old work directory if it exists 

    rm -rf $

fi



mkdir $

cd $

tar xzf $/$

cd $

./configure --prefix=/usr

make

既然已将构建系统拆成两个文档,我敢打赌,您一定在想他的工作原理。基本上,要编译 sed,输入:

$ ./ebuild sed-3.02.ebuild

当执行 "ebuild" 时,他首先试图 "source" 变量 ""。这是什么意思?还记得 前一篇文章 所讲的吗:"" 是第一个命令行自变量 -- 在这里,是 "sed-3.02.ebuild"。在 bash 中,"source" 命令从文档中读入 bash 语句,然后执行他们,就好象他们直接出现在 "source" 命令所在的文档中相同。因此,"source " 导致 "ebuild" 脚本执行在 "sed-3.02.ebuild" 中定义 "$P" 和 "$A" 的命令。这种设计更改确实方便,因为假如要编译另一个程式,而不是 sed,能够简单地创建一个新的 .ebuild 文档,然后将其作为自变量传递给 "ebuild" 脚本。通过这种方式,.ebuild 文档最终很简单,而将 ebuild 系统复杂的操作部分存在一处,即 "ebuild" 脚本中。通过这种方式,只需编辑 "ebuild" 脚本就能够升级或增强 ebuild 系统,同时将实现细节保留在 ebuild 文档之外。这里有一个 gzip 的样本 ebuild 文档:

gzip-1.2.4a.ebuild


#another really simple ebuild script!

P=gzip-1.2.4a

A=$.tar.gz



添加功能性
好,我们正在取得进展。但是,我还想添加某些额外功能性。我希望 ebuild 脚本再接受一个命令行自变量:"compile"、"unpack" 或 "all"。这个命令行自变量告诉 ebuild 脚本要执行构建过程的哪一步。通过这种方式,能够告诉 ebuild 解包档案,但不进行编译(以便在开始编译之前查看源代码档案)。要做到这点,将添加一条 case 语句,该语句将测试 "",然后根据其值执行不同操作。代码如下:

ebuild,修定本 2


#!/usr/bin/env bash



if [ $# -ne 2 ]

then 

    echo "Please specify two args - .ebuild file and unpack, compile or all"

    exit 1

fi





if [ -z "$DISTDIR" ]

then 

    # set DISTDIR to /usr/src/distfiles if not already set

    DISTDIR=/usr/src/distfiles

fi

export DISTDIR



ebuild_unpack() {

    #make sure we're in the right directory 

    cd $

    

    if [ -d $ ]

    then    

        rm -rf $

    fi



    mkdir $

    cd $

    if [ ! -e $/$ ]

    then

        echo "$/$ does not exist.  Please download first."

        exit 1

    fi    

    tar xzf $/$

    echo "Unpacked $/$."

    #source is now correctly unpacked

}





ebuild_compile() {

    

    #make sure we're in the right directory

    cd $

    if [ ! -d "$" ]

    then

        echo "$ does not exist -- please unpack first."

        exit 1

        fi

    ./configure --prefix=/usr

    make     

}



export ORIGDIR=`pwd`

export WORKDIR=$/work



if [ -e "" ]

then 

    source 

else

    echo "Ebuild file  not found."

    exit 1

fi



export SRCDIR=$/$



case "" in

    unpack)

        ebuild_unpack

        ;;

    compile)

        ebuild_compile

        ;;

    all)

        ebuild_unpack

        ebuild_compile

        ;;

    *)

        echo "Please specify unpack, compile or all as the second arg"

        exit 1

        ;;

esac

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!