shell中的几种少见的变量继承(传递)方式
来源:互联网 发布:网络键盘手会判刑几年 编辑:程序博客网 时间:2024/06/18 14:30
shell中的几种少见的变量继承(传递)方式
背景
众所周知,父shell中的临时变量是不能被子shell继承的。要想继承只能在父shell中将变量使用export导出,变为环境变量。
但是这几天研究一些著名开源项目中的configure脚本,发现了一些不同寻常的方式可以让子shell继承父shell中的变量而不用export导出。
使用小括号传递变量
AA=aa(echo ${AA})
按理说小括号里的命令是在子shell中执行的,子shell中变量AA
应该是空,但是这种情况下确实会输出aa
。
结论
小括号中的命令在执行时可以继承括号外层的临时变量
总结
这种用法在其他的博客中基本都是在讲几种括号时随口提一句,有些博客甚至都没指明这一点,只是在代码里出现,不知道的人甚至以为代码写错了。
没有一篇博客专门说明这种用法。只有chinaunix论坛上的一篇帖子对此有讨论,但也没有什么结论。
所以这里我也只是指出这种特殊的用法,对于原理不做讨论。
将变量在启动时传入脚本中
test.sh
echo ${AA}
shell:
AA=aa ./test.sh
执行脚本的父shell中的临时变量按理说是不能被脚本继承的,在脚本中变量AA
应该是空,但是这种情况下确实会输出aa
结论
将定义变量的语句放在启动脚本的前面 就可以将定义的变量传入脚本中,注意一定要将定义变量的语句和启动脚本的命令写在同一行,分开无法生效
总结
这个用法是在x264的configure脚本中学到的。
x264的configure脚本中的CC
变量在脚本的开头就直接进行判断如果是空就赋值为gcc
,然后再也不会修改。那么怎么支持其他的编译器的呢?后来在一篇x264编译的文章中看到了这种用法,但是作者也没有对此特别说明。
这种用法非常的隐蔽,目前为止完全没有找到任何一篇文章(包括英文的)对这种用法有任何说明。我在这篇文章中特此说明,也算填补空白了。
- shell中的几种少见的变量继承(传递)方式
- 少见的几种动画效果
- Shell的几种变量
- 几种继承的方式
- Shell基础教程,什么是Shell?Shell脚本的执行方式,Shell中的变量,Shell中的特殊变量
- PB中的几种参数传递方式
- Javascript中的几种继承方式比较
- js中的几种继承方式
- Javascript中的几种继承方式比较
- javascript中的几种继承方式
- Javascript中的几种继承方式比较
- JavaScript中的几种继承方式
- Javascript中的几种继承方式
- 静态参数传递的几种方式
- kernel cmdline的几种传递方式
- Android 数据传递的几种方式
- Intent传递对象的几种方式
- Intent传递对象的几种方式
- 选择排序(java实现)
- Educational Codeforces Round 20 Distances to Zero
- Android
- 个人对kobject的一点研究
- 安装ubantu和vmtools
- shell中的几种少见的变量继承(传递)方式
- GitBash上传项目到github,以及SSH免密码上传
- 2011年戴尔笔记本维修总结
- 第2章、Lift和HTML
- GraphLite图计算PageRank
- RabbitMQ(六)
- 数据结构 二叉搜索树
- ASP.Net MVC + Data Table 实现分页+排序
- linux nginx启动,重启,关闭命令