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编译的文章中看到了这种用法,但是作者也没有对此特别说明。

这种用法非常的隐蔽,目前为止完全没有找到任何一篇文章(包括英文的)对这种用法有任何说明。我在这篇文章中特此说明,也算填补空白了。

0 0
原创粉丝点击