一个config的shell文件的学习

configure

这个文件来自OpenJdk的config文件,我们随后会发现这只是个代理文件,里面只有短短几行,却让我见识了各种骚操作的语法,下面是去掉注释后的代码

this_script_dir=`dirname $0`
this_script_dir=`cd $this_script_dir > /dev/null && pwd`
bash ${-:+-$-} -c ". $this_script_dir/make/autoconf/configure" $this_script_dir/configure CHECKME $this_script_dir "$@"

$0

先看第一行,$0的含义是取执行这个shell文件时的指令
如果是CLI通过下面命令执行了configure文件,$0取到的值就是./configure,使用其他相对路径的方法结果类似

./configure

如果是CLI通过下面命令执行了configure文件,$0取到的值就是/home/qbit/CLionProjects/jdk/configure

/home/qbit/CLionProjects/jdk/configure

总的来说 $0的目的就是得到CLI下输入的指令,后面可以发现这里是为了处理通过相对路径执行configure文件情况,是为了确定configure文件相对于CLI的当前目录的位置。

dirname

这个命令从名字上也可以看出是为了获取后面文件所在的文件夹

`

反引号的作用和 **$( )**是类似的。后者更直观,前者兼容性更好。

this_script_dir

严格来说,第一行这个变量名称起的不好,应该叫this_script_file

cd

cd是为了切换当前目录,从这个例子也可以看出是为了后面执行的命令做准备。

> /dev/null

这个是为了舍弃命令的输出,我这里还是没看明白。第一,不管输出如何都不会影响后面pwd命令的执行;第二,cd命令本身是没有输出的。

pwd

pwd用于获取当前目录绝对路径,注意当前目录已经受到了前面cd的影响。至此,前两条命令的目的才达到,就是为了获取configure文件所在目录的绝对路径。

${-:+-$-}

这真是一个让人头大的操作

-

这个符号出现了三次,其中第三次是内置变量,可以在前面加上** $**来获取当前shell的一些控制参数,这些控制参数的具体含义可以参见其他博客,我在CLI下echo得到的是himBHs,而在shell文件里会有不同。
至于第二次出现就是一个简单的字符串了

:+

这是一个类似于 ?: 的二元运算符,作用是当前面为非空值时取后面值,这个系列还有些其他用法,也可以参见其他博客

-$-

上面那一套骚操作的目的就是为了把当前shell进程的控制参数传递给子进程,我试了下(使用echo)感觉和-$-的效果一样啊

bash -c

这个使用man就可以知道,至于为什么要新起一个进程,我猜是为了避免环境变量干扰。

CHECKME

这个不是shell的语法,算是一个小技巧。可以看出来这个configure调用了make/autoconf/configure这个文件,为了确保后者只能被前者调用,前者传递了神秘参数,然后后者一开始就执行以下代码,从而确保自己不被乱调用。

if test "x$1" != xCHECKME; then
  echo "ERROR: Calling this wrapper script directly is not supported."
  echo "Use the 'configure' script in the top-level directory instead."
  exit 1
fi

$@

这个是把自身的所有参数都传递过去(注意参数的位置发生了改变,所以被调用的脚本需要通过两个shift来还原),具体函数可以参见百度问答

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值