当前位置: 首页 > news >正文

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 继续

http://www.dtcms.com/a/358517.html

相关文章:

  • python pyqt5开发DoIP上位机【源码】
  • Spring代理的特点
  • Photoshop - Ps Camera Raw 滤镜
  • 【Python+requests】解决Python requests中的ProxyError:SSL版本错误问题详解
  • C++中的临时对象与移动语义——深入理解与实践
  • 消费 $83,用Claude 实现临床护理系统记录单(所见即所得版)
  • 拦截器Intercepter
  • 基于单片机智能垃圾桶/垃圾分类/语音垃圾桶
  • Spring MVC 参数绑定的默认行为解析
  • MySQL错误1449: The user specified as a definer (‘root‘@‘%‘) does not exist
  • MIT 6.5840 (Spring, 2024) 通关指南——Lab 1: MapReduce
  • JC系列串口通信说明
  • day45-Ansible流程控制
  • 同步/异步日志库
  • 佳易王钟表维修养护管理系统:开启钟表维修高效管理新篇章​就#软件操作教程
  • Compare With Java And Python
  • springboot 实现不同接口指定上传文件大小
  • Linux 定时器:工作原理与实现机制深入分析
  • AI公司是怎样对权重和损失函数做处理的?
  • Oracle下载安装(学习版)
  • 向华为学习——解读73页业务迁移基本流程设计与华为迁移方案【附全文阅读】
  • 计算机三级嵌入式填空题——真题库(26)原题附答案速记
  • Java学习历程17——利用泛型优化自定义动态数组
  • 深度学习入门,基于python的理论与实现
  • PostgreSQL WAL机制深度解析与优化
  • 如何简单建设一个网站,让用户快速找到你。
  • 【物联网】BLE 系统架构全景图
  • 常量指针与指针常量习题(一)
  • Swift 解法详解:LeetCode 367《有效的完全平方数》
  • Notepad++使用技巧1