2021SC@SDUSC
由于之前并没有学过shell的相关语法,因此学了一些基本的shell语法再来分析。但是依然相当困难:
bootstrap.sh的全代码如下:
首先从整体来看文件开局定义了一个变量。然后构造了一个provide函数和一个require函数,并且provide 最后提供了 'bootstrap'参数。具体的细节依然是看不懂。
从注释中我们知道改文件是用来引导模块系统的。
用法:1.在主脚本中创建文件 2.需求模块名称 。在模块中需要模块依赖,定义模块和提供”模块名称“。
第一行代码创建了module_root_dir,该变量为模块根目录的名称。存在一个BASH_SOURCE[]数组。dirname +该数组的第一个值构成一个变量。然后模块根目录的名称就是这个变量的值。
再看provide函数内部的代码。先创建了一个本地变量module_name,该值等于第一个参数。provide函数第二行代码刚开始整不明白,去网上找了好久都没找到+=这个用法。然后就自己去shell上试着用。+=是讲b当作字符串使用。+=后面的内容以字符串的方式加到原有内容的后面。所以这个加载的模块名是之前模块的名称不断加在其后。但是,从整体可以看到,整个provide函数并没有read任何参数,而是直接被提供了参数"bootstrap",所以loaded_modules只能是无数个”bootstrap"。(或许可以从这个看出引导了多少模块?)但是从后面看出来,loaded_modules是已导入模块,require或许才是要新提供的。provide只用前面的bootstrap,所以是引导模块。
再看require函数,本地变量赋值第一个参数。
然后就碰到我一直没找到的内容了。<<<是什么意思。在网上也找不到相关内容。做相关猜测最后都报错了。然后将这段代码复制到test.sh中,然后chmod +x加了权限后执行并没有报错。
所以只能猜测了。grep -qF 应该是从相应文件中获取所有模式并抑制所有正常的输出。大概是如果module_name在loaded_module中已存在了?然后就直接返回。如果不存在。那么创建一个模块根目录下的该文件。假设module_root_dir的值为a,导入进来的参数为b。则创建a/b.sh文件。之后再检查一遍,如果已存在该文件了。就重定向输入到标准错误文件中,报一个Error:加载该文件失败。