118、【OS】【Nuttx】【周边】效果呈现方案解析:作用域?
【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
接之前 blog
【OS】【Nuttx】【周边】效果呈现方案解析:while 循环处理(上)
【OS】【Nuttx】【周边】效果呈现方案解析:while 循环处理(下)
分析了 while 循环结构,包括循环条件,下面来看 while 循环里面执行的内容
while 循环处理
回到这里的内容
下面来看循环体里面查找最新 html 的语句
local file_mtime=$(find "$dir" -name "*.html" -type f -printf '%T@' 2>/dev/null | sort -n | tail -1)
local
这里再讲下 local 关键字
local 命令不是 POSIX 标准定义的一部分,在其规范 《The Open Group Base Specifications Issue 7, 2018 edition》 上没有 local 命令的相关描述,查看 2.5 章节 Parameters and Variables
这里只说变量被赋值之后就是被设置(set) 了,但没有指定说在哪个作用域被设置,也没有定义局部变量或作用域的概念,唯一的操作是 unset,它作用于变量本身,不分局部或全局,POSIX 规范中变量模型是扁平的,一旦 variable=value 执行了,这个变量就存在于当前的执行环境中,直到被 unset,没有机制来创建一个只在特定作用域存在的变量
上面分析了,虽然没有全局或者局部作用域之分,但并不代表 set 的变量会一直存在下去,事实上,POSIX 规范倾向于使用更精确的技术术语,比如 Shell Execution Environment,也就是上面说的当前执行环境,在当前 Shell 执行环境下,set 的变量会一直存在,直到 unset 操作,或者当前执行环境退出
在 2.12 章节 Shell Execution Environment 里面有几个描述点
当执行一个外部命令【非内建命令】时,会创建一个分离的环境,在这个分离环境中,只有被 export 的变量会作为环境变量传递过去,没有被 export 的变量不会传递,并且外部命令的执行不会改变 ParentShell 环境,这里定义了变量如何跨越进程边界
在终端输入 type + 命令,可查看命令类型,是外部还是内建(相对于 Shell)
type command
比如 ls,ll,awk 等命令是外部的
而 cd,echo,while 是 Shell 内建命令或关键字,属于当前执行环境
此外,SubShell Environment 是当前 Shell Environment 的副本,意味着 SubShell 继承了 ParentShell 的所有变量(包括没有 export 的),此时对 SubShell 环境的修改不会影响 ParentShell 环境,在 SubShell 中修改变量,比如 var=modified,这个修改在 SubShell 结束后就消失了,在 ParentShell 中,var 仍然是原来的值,比如下图(通过圆括号()可以创建 SubShell)
前面分析了 local 和 POSIX 标准没有关系,POSIX 规范也没有作用域相关的概念,这个关键字是 Bash 特有的扩展,是 Bash 等一些 Shell 为了方便脚本编写而引入的扩展功能,主要目的是为了在函数内部声明局部变量,在终端输入
man bash | grep -A 5 -B 2 'local \['
可查看 Bash 对 local 关键字的语法描述
注意,由于 local 关键字不是 POSIX 标准的一部分,所以这个脚本在标准的 sh 或其他严格遵循 POSIX 的 Shell 中可能无法运行
ok,先到这里,下篇 blog 继续