当前位置: 首页 > 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.xdnf.cn/news/1399303.html

相关文章:

  • 生成一份关于电脑电池使用情况、健康状况和寿命估算的详细 HTML 报告
  • 软考中级习题与解答——第一章_数据结构与算法基础(2)
  • 【Redisson 加锁源码解析】
  • VuePress添加自定义组件
  • 【MySQL数据库】索引 - 结构 学习记录
  • 加速智能经济发展:如何助力“人工智能+”战略在实时视频领域的落地
  • Swift 解法详解:LeetCode 367《有效的完全平方数》
  • Kafka入门
  • 开源 C++ QT Widget 开发(八)网络--Http文件下载
  • 《微服务架构从故障频发到自愈可控的实战突围方案》
  • CSDN博客语法(不常用但有用)
  • 谷歌 “Nano Banana“ 深度解析:AI 图像的未来是精准编辑,而非从零生成
  • ⚡ Linux find 命令参数详解
  • MySQL基础理解入门
  • 嵌入式硬件电路分析---AD采集电路
  • Spring Boot 自动配置原理深度解析:从启动流程到监听机制
  • 【Java EE进阶 --- SpringBoot】Spring Web MVC(Spring MVC)(二)
  • 设计模式之代理模式!
  • 深度学习基础:前馈网络、反向传播与梯度问题
  • 基于IEC61499开放自动化PLC数据储存方案
  • 在 WSL2-NVIDIA-Workbench 中安装Anaconda、CUDA 13.0、cuDNN 9.12 及 PyTorch(含完整环境验证)
  • 第 8 篇:量化交易之tradeUI和webserverUI 区别?
  • 系统分析师考试大纲新旧版本深度分析与备考策略
  • 捡捡java——2、基础07
  • 开发指南136-设置零值不显示
  • vue中的与,或,非
  • Ansible 核心运维场景落地:YUM 仓库、SSH 公钥、固定 IP 配置技巧
  • [Windows] 剪映国际版CapCut 6.7.0 视频编辑处理,免费使用素材和滤镜
  • 拼团小程序源码分享拼团余额提现小程序定制教程开发源码二开
  • LeetCode 136. 只出现一次的数字