shell脚本解析 -- oe-init-build-env

oe-init-build-envshell

#!/usr/sh
if [ -z "$ZSH_NAME" ] && [ "x$0" = "x./oe-init-build-env" ]; then
   echo "Error: This script needs to be sourced. Please run as '. ./oe-init-build-env'"
else
   if [ -n "$BASH_SOURCE" ]; then
      OEROOT="`dirname $BASH_SOURCE`"
   else
      OEROOT="`pwd`"
   fi
   OEROOT=`readlink -f "$OEROOT"`
   export OEROOT
   . $OEROOT/scripts/oe-buildenv-internal && \
        $OEROOT/scripts/oe-setup-builddir && \
        [ -n "$BUILDDIR" ] && cd $BUILDDIR
   unset OEROOT
   unset BBPATH
fi

第一步,判断该脚本是不是用source或者.的方法运行的。 可是ui

[ "x$0" = "x./oe-init-build-env" ]
只能对./oe-init-build-env这种执行方式报错,对./yocto/oe-init-build-env是不会报错的。


第二步,设置OEROOT这个变量。当用.或者source去执行脚本时,BASH_SOURCE这个变量会被自动设置到源文件路径。因而dirname $BASH_SOURCE就得到了脚本所在目录。readlink -f $OEROOT得到了绝对路径。code

 

第三步,执行oe-buildenv-internal和oe-setup-builddir这两个脚本,而且进入到build目录。ip

(注意这里的oe-buildenv-internal是用.执行的,而oe-setup-build是fork shell执行的。由于oe-setup-builddir中用到了OEROOT这个变量,因此在此以前,OEROOT必须被export,正如脚本中所作的那样。)it

 

第四步,unset一些变量。由于.或者source的执行方式是在原shell中执行,并不fork shell,因此若是不unset,会一直留在该shell中。class

 

chenqi@chenqi-laptop ~/MyPro/ShellScript/yocto $ . ./oe-init-build-env
BASH_SOURCE = ./oe-init-build-env, OEROOT = .
OEROOT = /home/chenqi/MyPro/ShellScript/yocto变量

 

chenqi@chenqi-laptop ~/MyPro/ShellScript $ source yocto/oe-init-build-env
BASH_SOURCE = yocto/oe-init-build-env, OEROOT = yocto
OEROOT = /home/chenqi/MyPro/ShellScript/yocto方法

 

可见,不管在哪一个目录下执行,最后得到的OEROOT的绝对路径都是一致的。(主要利用BASH_SOURCE, dirname, readlink)。脚本

相关文章
相关标签/搜索