146、【OS】【Nuttx】【周边】效果呈现方案解析:特殊变量$
【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
上篇 blog
【OS】【Nuttx】【周边】效果呈现方案解析:VSCode Remote Server
分析了 egrep
命令找到了 URL 链接内容 http:
,然后开始通过 broswer.sh 处理打开网页的请求,并简单分析了下 VSCode 在 ~/.vscode-server/ 路径下自动部署的内容,下面继续来看下
特殊变量$
上篇 blog 【OS】【Nuttx】【周边】效果呈现方案解析:VSCode Remote Server 最后介绍了虽然都输入的是 echo $PATH
命令,但是由于它们运行在不同的会话,所以 PATH 已经被隔离开,下面就这个点再展开下
之前 blog 【OS】【Nuttx】【周边】效果呈现方案解析:测试命令 介绍了一下 Linux 中的一些特殊变量,比如 $?
表示记录下最后一个命令的退出状态
这里的 $$
也是个变量,返回 Shell 进程 ID(Process ID),Shell 一旦启动,其 $$
PID 就固定了,永远不变
另外,要注意下这里的描述,$$
永远返回的是 父Shell 的 PID,不会随着 子Shell 改变
子Shell 指的是当前 Shell 环境(也就是 父Shell)派生的一个独立副本,子Shell 继承 父Shell 的环境变量,函数等,但有自己的进程 ID(PID),在 子Shell 中做的大多数更改(比如变量赋值,目录切换等)不会影响 父Shell,这里注意,$$
指向的 父Shell PID 不会变,可以用 $BASHPID
查看 子Shell 的 PID
举个例子,在 父Shell 中输入
$$
显示当前 Shell 的 PID 为 34410
接着在 父Shell 输入
echo $BASHPID
可以看到 $$
和 $BASHPID
的结果都是一样的,指向当前 父Shell 的 PID
接着在终端输入
(echo $$)
可以看到 子Shell 中,$$
指向的也是 父Shell 的 PID
在终端输入
(echo $BASHPID)
输入 $BASHPID
后,可以看到 子Shell 的 PID 为 661896,和 父Shell 不一样
这里涉及到 Shell 中的 ( )
特性,终端输入
man bash
可以看到 (list)
特性描述如下,这里 list 表示 command 命令集合
- 当把一组命令写在圆括号里,比如
(command1; command2)
,这组命令会在 子Shell 中执行,子Shell 执行完命令后会自动退出,回到原来的 Shell,也就是 父Shell - 在 子Shell 中做的任何环境修改,在 子Shell 执行结束后都不会保留到 父Shell 中,比如变量赋值
(test_name="Tom"; echo $test_name)
,这个 name 变量只在括号内有效,外面无法访问
还有一些影响环境的内建命令,比如cd
,export
,unset
等,在 子Shell 中执行也不会影响到 父Shell - 整个 list 命令集合的退出状态和 list 里面最后一个命令的退出状态有关,如果 list 中最后一个命令成功(退出码为 0),那整个 list 也返回 0;同样,如果最后一个命令失败(比如退出码为 1),那 list 也返回 1
ok,先到这里,下篇 blog 继续