BASH代码Refine实例

有段代码是这么写的:

function build_license_3_0(){
    echo "build license_3.0 in ${work_dir}"
    cat << END
        cd ${work_dir} &&
        "Building C object license.o"
        gcc -DARCH_X86_64 -DBUILD_TIME=$buildtime -g -pthread -Wall -g -O0 -I${work_dir} -o ${work_dir}/bin/license.o -c ${work_dir}/license.c &&

        "Building C object hwinfo.o"
        gcc -DARCH_X86_64 -DBUILD_TIME=$buildtime -g -pthread -Wall -g -O0 -I${work_dir} -o ${work_dir}/bin/hwinfo.o -c ${work_dir}/hwinfo.c &&

        "Linking hwinfo.o and license.o to C static library liblicense.a"
        ar cr ${work_dir}/bin/liblicense.a ${work_dir}/bin/hwinfo.o ${work_dir}/bin/license.o && ranlib ${work_dir}/bin/liblicense.a &&

        "Building C object verify_license.o"
        gcc -DARCH_X86_64 -DBUILD_TIME=1410589555 -g -pthread -Wall  -g -O0 -I${work_dir} -o ${work_dir}/bin/verify_license.o -c ${work_dir}/verify_license.c &&

        "Linking C executable verify_license"
        gcc  -g -pthread -Wall  -g -O0 verify_license.o -I${work_dir}  -o ${work_dir}/bin/verify_license ${work_dir}/bin/liblicense.a -lcrypto &&

        mkdir ${work_dir}/bin/shared

        "Building C object shared/hwinfo.o"
        gcc  -DARCH_X86_64 -DBUILD_TIME=buildtime -Dlicense_shared_EXPORTS -g -pthread -Wall  -g -O0 -fPIC -I${work_dir} -o ${work_dir}/bin/shared/hwinfo.o   -c ${work_dir}/hwinfo.c &&

        "Building C object shared/license.o"
        gcc  -DARCH_X86_64 -DBUILD_TIME=buildtime -Dlicense_shared_EXPORTS -g -pthread -Wall  -g -O0 -fPIC -I${work_dir} -o ${work_dir}/bin/shared/license.o   -c ${work_dir}/license.c &&

        "Linking C shared library liblicense-shared.so"
        gcc  -fPIC  -g -pthread -Wall  -g -O0 -shared -Wl,-soname,liblicense-shared.so -o ${work_dir}/bin/liblicense-shared.so ${work_dir}/bin/shared/license.o ${work_dir}/bin/shared/hwinfo.o  -lcrypto &&

        "Building C object /generate_hwinfo.o"
        gcc -g -pthread -Wall  -g -O0 -I${work_dir} -o ${work_dir}/bin/generate_hwinfo.o -c ${work_dir}/generate_hwinfo.c &&

        "Linking C executable generate_hwinfo"
        gcc -g -pthread -Wall  -g -O0 ${work_dir}/bin/generate_hwinfo.o  -o ${work_dir}/bin/generate_hwinfo ${work_dir}/bin/liblicense.a -lcrypto

        "clear .o files"
        sudo rm ${work_dir}/bin/generate_hwinfo.o ${work_dir}/bin/verify_license.o
        ${work_dir}/bin/license.o
        ${work_dir}/bin/hwinfo.o &&
        sudo rm -rf ${work_dir}/bin/shared

END
    (
        cd ${work_dir} && mkdir -p ${work_dir}/bin &&
        echo "Building C object license.o"
        gcc -DARCH_X86_64 -DBUILD_TIME=$buildtime -g -pthread -Wall -g -O0 -I${work_dir} -o ${work_dir}/bin/license.o -c ${work_dir}/license.c &&

        echo "Building C object hwinfo.o"
        gcc -DARCH_X86_64 -DBUILD_TIME=$buildtime -g -pthread -Wall -g -O0 -I${work_dir} -o ${work_dir}/bin/hwinfo.o -c ${work_dir}/hwinfo.c &&

        echo "Linking hwinfo.o and license.o to C static library liblicense.a"
        ar cr ${work_dir}/bin/liblicense.a ${work_dir}/bin/hwinfo.o ${work_dir}/bin/license.o && ranlib ${work_dir}/bin/liblicense.a &&

        echo "Building C object verify_license.o"
        gcc -DARCH_X86_64 -DBUILD_TIME=$buildtime -g -pthread -Wall  -g -O0 -I${work_dir} -o ${work_dir}/bin/verify_license.o -c ${work_dir}/verify_license.c &&

        echo "Linking C executable verify_license"
        gcc  -g -pthread -Wall  -g -O0 ${work_dir}/bin/verify_license.o -I${work_dir} -o ${work_dir}/bin/verify_license ${work_dir}/bin/liblicense.a -lcrypto &&

        mkdir ${work_dir}/bin/shared

        echo "Building C object shared/hwinfo.o"
        gcc  -DARCH_X86_64 -DBUILD_TIME=$buildtime -Dlicense_shared_EXPORTS -g -pthread -Wall  -g -O0 -fPIC -I${work_dir} -o ${work_dir}/bin/shared/hwinfo.o   -c ${work_dir}/hwinfo.c &&

        echo "Building C object shared/license.o"
        gcc  -DARCH_X86_64 -DBUILD_TIME=$buildtime -Dlicense_shared_EXPORTS -g -pthread -Wall  -g -O0 -fPIC -I${work_dir} -o ${work_dir}/bin/shared/license.o   -c ${work_dir}/license.c &&

        echo "Linking C shared library liblicense-shared.so"
        gcc  -fPIC  -g -pthread -Wall  -g -O0 -shared -Wl,-soname,liblicense-shared.so -o ${work_dir}/bin/liblicense-shared.so ${work_dir}/bin/shared/license.o ${work_dir}/bin/shared/hwinfo.o  -lcrypto &&

        echo "Building C object /generate_hwinfo.o"
        gcc -g -pthread -Wall  -g -O0 -I${work_dir} -o ${work_dir}/bin/generate_hwinfo.o -c ${work_dir}/generate_hwinfo.c &&

        echo "Linking C executable generate_hwinfo"
        gcc -g -pthread -Wall  -g -O0 ${work_dir}/bin/generate_hwinfo.o  -o ${work_dir}/bin/generate_hwinfo ${work_dir}/bin/liblicense.a -lcrypto

        echo "clear .o files"
        sudo rm ${work_dir}/bin/generate_hwinfo.o ${work_dir}/bin/verify_license.o &&
        sudo rm ${work_dir}/bin/license.o ${work_dir}/bin/hwinfo.o
        sudo rm -rf ${work_dir}/bin/shared
    )
    ret=$?; if [[ 0 -ne ${ret} ]]; then echo "build license_3.0 failed"; return $ret; fi

    echo "license builded in "
    echo "    ${work_dir}/bin/generate_hwinfo";
    echo "    ${work_dir}/bin/verify_license";
    echo "    ${work_dir}/bin/liblicense-shared.so";
    return 0;
}

这个bash代码是从cmake中翻译过来,一大堆的复杂逻辑其实就是编译两个binary和一个so文件,由于cmake的代码没有搞清楚,导致翻译过来的bash就巨复杂无比。

这个代码的问题:

  • cmake代码没有搞清楚到底什么是最简单的方式,一大堆复杂的方式,编译.a然后删掉,然后创建个shared编译so。其实就直接编译就完了,可以用一样的参数。
  • 没有检查错误,当gcc错误时还会继续。

其实可以改成这样:

function build_license_3_0(){
    echo "build license_3.0 in ${work_dir}"
    cd ${work_dir} && mkdir -p ${work_dir}/bin 
    
    echo "Building C object license.o" &&
    gcc -fPIC -DARCH_X86_64 -DBUILD_TIME=$buildtime -g -pthread -Wall -g -O0 -I${work_dir} -o ${work_dir}/bin/license.o -c ${work_dir}/license.c
    ret=$?; if [[ 0 -ne ${ret} ]]; then echo "Building C object license.o failed"; return $ret; fi

    echo "Building C object hwinfo.o" &&
    gcc -fPIC -DARCH_X86_64 -DBUILD_TIME=$buildtime -g -pthread -Wall -g -O0 -I${work_dir} -o ${work_dir}/bin/hwinfo.o -c ${work_dir}/hwinfo.c
    ret=$?; if [[ 0 -ne ${ret} ]]; then echo "Building C object hwinfo.o failed"; return $ret; fi

    echo "Linking C shared library liblicense-shared.so"
    gcc  -fPIC  -g -pthread -Wall  -g -O0 -shared -Wl,-soname,liblicense-shared.so -o ${work_dir}/bin/liblicense-shared.so \
        ${work_dir}/bin/license.o ${work_dir}/bin/hwinfo.o  -lcrypto
    ret=$?; if [[ 0 -ne ${ret} ]]; then echo "Building C object liblicense-shared.so failed"; return $ret; fi

    echo "Linking C executable generate_hwinfo"
    gcc -g -pthread -Wall  -g -O0 ${work_dir}/generate_hwinfo.c  -o ${work_dir}/bin/generate_hwinfo \
        ${work_dir}/bin/license.o ${work_dir}/bin/hwinfo.o -lcrypto
    ret=$?; if [[ 0 -ne ${ret} ]]; then echo "Building C object generate_hwinfo failed"; return $ret; fi

    echo "Linking C executable verify_license"
    gcc -DARCH_X86_64 -DBUILD_TIME=$buildtime -g -pthread -Wall  -g -O0 ${work_dir}/verify_license.c -I${work_dir} -o ${work_dir}/bin/verify_license \
        ${work_dir}/bin/license.o ${work_dir}/bin/hwinfo.o -lcrypto 
    ret=$?; if [[ 0 -ne ${ret} ]]; then echo "Building C object verify_license failed"; return $ret; fi

    echo "license builded in "
    echo "    ${work_dir}/bin/generate_hwinfo";
    echo "    ${work_dir}/bin/verify_license";
    echo "    ${work_dir}/bin/liblicense-shared.so";
    return 0;
}

简单的事情偏偏要复杂化,这种趋势不是只有c/c++/js/as中才有,bash也一样。

代码就是代码,没有区别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

winlinvip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值